构建Where子句(不确定PredicateBuilder对我有用)

时间:2012-08-17 15:32:20

标签: c# asp.net linq

我正在尝试使用LINQ查询数据库。我正在使用TableC与TableB一起加入TableA。

我想要在(LIKE'%%')内找到分布在三个表格中的几个字段的零到多'关键字'(不知道在设计时有多少)。

假设我的搜索框中输入了三(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 - 我没有(出于本问题范围之外的原因)想要在三个表格中创建一个VIEW

注意#2 - 因为我以这种方式加入(我还是LINQ的新手)我不知道如何使用PredicateBuilder,因为我不确定要传入什么TYPE(T)?

注意#3 - 如果重要......我最终计划返回一个强类型的(自定义)对象列表,以便在GridView中显示。

编辑 - 2012年8月17日 - 美国东部时间下午5:15

以下评论是正确的。

“OP正在寻找的代码是,其中任何一个字段都包含任意一个关键字。”

谢谢大家!

1 个答案:

答案 0 :(得分:3)

这是一个不使用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();