c# - 构建 Where 子句(不确定 PredicateBuilder 是否适合我)

标签 c# asp.net linq

我正在尝试使用 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/

相关文章:

c# - 在没有 string.Split 的情况下拆分字符串

c# - 工厂模式构建许多派生类

asp.net - 使用 ASP.NET 5 中的默认 DI 容器一次性注册所有服务,类似于 Autofac

asp.net - 尝试在VS2013中启动ASP.NET项目时出现"An operation is not legal in the current state"错误?

.net - 有没有类似于python的linq枚举的东西

c# - 使用 Nunit TestCaseSource 运行测试设置的正确方法

javascript - 如何使用 SignalR 处理移动设备上的断开连接事件?

.net - 从网页轮询数据库? - ASP.NET

c# - 在 List<DataRow> 中搜索?

c# - 多线程访问 System.Collection.Concurrent 中的非线程安全值?