代码之家  ›  专栏  ›  技术社区  ›  StampedeXV

与值列表比较的文本字段上的linq.where-to-sql

  •  0
  • StampedeXV  · 技术社区  · 16 年前

    customer.text是t-sql db中的一个“text”类型的字段(我无法控制,因此可能无法更改)。

    我想这样做:

    List<string> compare = new List<string>();
    compare.Add("one");
    compare.Add("two");
    
    var q = from t in customer
            where t.text.Contains( compare.First())
            select t;
    

    这会奏效的。

    但现在我想做的是:(!不工作!)

    var q = from t in customer
            where compare.Contains( t.text )
            select t;
    

    我怎样才能做到这一点?有可能吗?

    编辑:问题显然不是很清楚:不能使用“=”查询SQL中的文本列,只能使用like。因此,compare.contains(t.text)将导致错误,因为它使用“=”转换为查询。

    我没有告诉你的是,我使用linq to orm(本例中为llblgen)。 我试过的:

    var q = from t in customer
            where compare.Any( x => t.text.Contains(x) )
            select t;
    

    现在这也不管用了。目前我不在工作,但是constantexpression不能转换成setexpression的情况除外。

    我希望这能澄清一些。

    编辑2:

    约瑟夫向我指出: PredicateBuilder . 它在给定的对象类型上创建表达式。 现在我的问题是,我的类型是多个连接中的匿名类型。 有什么简单或优雅的方法来处理这个问题吗?

    3 回复  |  直到 16 年前
        1
  •  1
  •   Andomar    16 年前

    现在我可能遗漏了一些东西,但是你的代码看起来应该可以工作。文件顶部是否包含命名空间?

    using System.Linq;
    using System.Linq.Expressions;
    

    您也可以在不使用linq2sql语法的情况下重写它,例如:

    var q = customer.Where(c => compare.Contains(c.text));
    
        2
  •  1
  •   Joseph Connolly    16 年前

    可以使用linqkit的自由谓词生成器类构建查询。这是一篇描述其用途的博客文章,并有一个指向下载站点的链接。

    http://thecodeslinger.wordpress.com/2008/10/28/linqkit-predicatebuildert-goodness/

    下面是来自post的代码示例

        //First get a list of keywords that match the description entered.
                    string[] parts = txtInclude.Text.Split(new[] {‘ ‘});
                    string[] noparts = null;
                    if(txtButNot.Text.Trim().Length > 0)
                        noparts = txtExclude.Text.Trim().Split(new[] {‘ ‘});
    
                    var pred = PredicateBuilder.True<Pet>();
       //here is where you would loop through your compare object
                    parts.ForEach(p => pred = pred.And(pl => pl.description.Contains(p)));
                    if(noparts != null)
                        noparts.ForEach(p => pred = pred.And(pl => !pl.description.Contains(p)));
    
                    var pets = from s in db.Pets.Where(pred)
                            select s;
    
        3
  •  0
  •   Joseph Connolly    16 年前

    必须将文本字段转换为字符串

            var query = from t in dataContext.table
                        where compare.Contains(t.textField.ToString())
                        select t;