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。 现在我的问题是,我的类型是多个连接中的匿名类型。 是否有一种简单或优雅的方式来处理这个问题?
答案 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;