我正在尝试使用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正在寻找的代码是,其中任何一个字段都包含任意一个关键字。”
谢谢大家!
答案 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();