Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# buildwhere子句(不确定PredicateBuilder是否适用于我)_C#_Asp.net_Linq - Fatal编程技术网

C# buildwhere子句(不确定PredicateBuilder是否适用于我)

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

我正在尝试使用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 = 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”:-(