C# buildwhere子句(不确定PredicateBuilder是否适用于我)
我正在尝试使用LINQ查询数据库。我将表A与表B与表C合并 我有零到多个“关键字”(在设计时不知道有多少),我希望在分布在三个表中的几个字段(如“%”)中查找这些关键字 假设在我的搜索框中输入了三(3)个关键字: 在T-SQL中,我会有这个-C# buildwhere子句(不确定PredicateBuilder是否适用于我),c#,asp.net,linq,C#,Asp.net,Linq,我正在尝试使用LINQ查询数据库。我将表A与表B与表C合并 我有零到多个“关键字”(在设计时不知道有多少),我希望在分布在三个表中的几个字段(如“%”)中查找这些关键字 假设在我的搜索框中输入了三(3)个关键字: 在T-SQL中,我会有这个- SELECT tbl0.FieldA, tbl0.FieldB, tbl1.FieldC, tbl1.FieldD, tbl2.FieldE, tbl2.FieldF FROM tbl0 JOIN tbl1 ON tbl0.KeyField = tbl
SELECT tbl0.FieldA, tbl0.FieldB, tbl1.FieldC, tbl1.FieldD, tbl2.FieldE, tbl2.FieldF
FROM tbl0
JOIN tbl1 ON tbl0.KeyField = tbl1.KeyField
JOIN tbl2 ON tbl1.KeyField = tbl2.KeyField
WHERE (tbl0.FieldA LIKE '%{keyword1}%' OR tbl1.FieldC LIKE '%{keyword1}%' OR tbl2.FieldE LIKE '%{keyword1}%' OR tbl0.FieldA LIKE '%{keyword2}%' OR tbl1.FieldC LIKE '%{keyword2}%' OR tbl2.FieldE LIKE '%{keyword2}%' OR tbl0.FieldA LIKE '%{keyword3}%' OR tbl1.FieldC LIKE '%{keyword3}%' OR tbl2.FieldE LIKE '%{keyword3}%')
问题是——我如何在LINQ中“动态”构建这个WHERE子句
注意#1——我不想(出于本问题范围之外的原因)在这三个表之间创建视图
注意#2——因为我是以这种方式加入的(而且我对LINQ还是新手),我不知道如何使用PredicateBuilder,因为我不确定传入它的类型(t)
注#3——如果重要的话。。。我最终计划返回要在GridView中显示的(自定义)对象的强类型列表
编辑-2012年8月17日-美国东部夏令时下午5:15
下面的评论是正确的
“OP要查找的代码是,其中任何一个字段都包含任何一个关键字”
谢谢大家 这里有一个不使用PredicateBuilder的解决方案。只需获取包含第一个关键字的所有项目,并将其与包含第二个关键字的所有项目合并,依此类推。不知道问题的背景,我不知道这是否有效
var query = from t0 in db.Table0
join t1 in db.Table1 on t0.KeyField equals t1.KeyField
join t2 in db.Table2 on t1.KeyField equals t2.KeyField
select new
{
t0.FieldA, t0.FieldB,
t1.FieldC, t1.FieldD,
t2.FieldE, t2.FieldF
};
string keyword = keywordsList[0];
var result = query.Where(x => x.FieldA.Contains(keyword) ||
x.FieldC.Contains(keyword) ||
x.FieldE.Contains(keyword));
for (int i = 1; i < keywordsList.Length; i++)
{
string tempkey = keywordsList[i];
result = result.Union(query.Where(x => x.FieldA.Contains(tempkey) ||
x.FieldC.Contains(tempkey) ||
x.FieldE.Contains(tempkey)));
}
result = result.Distinct();
var query=从db.Table0中的t0开始
将t1连接到t0上的db.Table1中。KeyField等于t1.KeyField
将t2连接到t1上的db.Table2中。KeyField等于t2.KeyField
选择新的
{
t0.FieldA,t0.FieldB,
t1.FieldC,t1.FieldD,
t2.FieldE,t2.FieldF
};
字符串关键字=关键字列表[0];
var result=query.Where(x=>x.FieldA.Contains(关键字)||
x、 FieldC.Contains(关键字)||
x、 包含(关键字));
for(int i=1;ix.FieldA.Contains)(tempkey)||
x、 字段c.包含(临时键)||
x、 包含(tempkey));
}
result=result.Distinct();
这将导致获取任何字段中存在每个关键字的所有行。OP要查找的代码是任何一个字段包含任何一个关键字的地方。换句话说,你需要或你的每一个子表达式,但目前你正在和它们进行ANDing。Servy-我相当肯定你是完全正确的,因为我昨晚试过这个。当我设置断点并查看生成的SQL时,它使用的是每个关键字之间的and(在foreach循环中)。这是正确的=>“OP要查找的代码是任何一个字段包含任何一个关键字的地方。”@david.s-“对问题的背景一无所知,我无法判断这是否有效。”因此,‘挑战’是这样的。其中一个表(tbl0)包含两个VarChar(MAX)字段。最初在SQL server中创建了一个视图,该视图将三个表(tbl0、tbl1、tbl2)连接起来,并包含这些VarChar(MAX)字段。我发现,即使我没有“使用”这些字段(从某种意义上说,我没有检索存储在这些字段中的数据并将其显示在搜索结果页上)……仅仅将它们放在视图中会降低性能。@david.s-在你问“为什么不从视图中删除它们?”?“答案是:因为它们在WHERE中使用,而且据我所知,如果(a)它们将在WHERE中使用,并且(b)您将使用视图,那么它们需要包含在视图定义中。如上所述,即使我没有检索到要在页面上显示的数据,视图中有两个VarChar(MAX)字段似乎会降低性能。我刚刚刷新了页面。我错过了什么?下面的“答案”不起作用。Servy的评论是正确的。。。生成的SQL将包含“AND”,而不是“OR”:-(