我正在尝试使用 LINQ 查询数据库。我正在将 TableA 与 TableB 和 TableC 结合起来。
我有零到多个“关键字”(在设计时不知道有多少),我想在分布在三个表中的几个字段(如“%%”)中查找。
假设在我的搜索框中输入了三 (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 正在寻找的代码是其中任何一个字段包含任何一个关键字。”
谢谢大家!
最佳答案
这是一个不使用 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();
关于c# - 构建 Where 子句(不确定 PredicateBuilder 是否适合我),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12008758/