Linq.Where-to-SQL在文本字段上与值列表进行比较

时间:2010-04-06 15:19:53

标签: sql linq sql-like

Customer.text是“文本”类型的T-SQL数据库中的一个字段(我无法控制,因此可能无法更改)。

我想做这样的事情:

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的。

我希望这能得到一些澄清。

EDIT2:

约瑟夫向我指出:PredicateBuilder。它在给定的ObjectType上创建一个Expression。 现在我的问题是,我的类型是多个连接中的匿名类型。 是否有一种简单或优雅的方式来处理这个问题?

3 个答案:

答案 0 :(得分:1)

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

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

您也可以在没有Linq2Sql语法的情况下重写它,例如:

var q = customer.Where(c => compare.Contains(c.text));

答案 1 :(得分:1)

您可以使用LinqKit的免费谓词构建器类构建查询。这是一篇描述其用途的博客文章,并提供了下载网站的链接。

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

以下是帖子的代码示例

    //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;

答案 2 :(得分:0)

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

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