3

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

我有零到多个“关键字”(在设计时不知道有多少),我想在(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,因为我不确定要传递什么类型(T)?

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

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

下面的评论是正确的。

“OP 正在寻找的代码是任何一个字段包含任何一个关键字的地方。”

谢谢大家!

4

1 回答 1

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();
于 2012-08-17T15:43:45.043 回答