作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在创建一个搜索数据库并允许用户动态添加任何条件(大约 50 个可能)的应用程序,很像下面的 SO 问题:Creating dynamic queries with entity framework .我目前正在进行一项检查每个条件的搜索,如果它不为空,则会将其添加到查询中。
C#
var query = Db.Names.AsQueryable();
if (!string.IsNullOrWhiteSpace(first))
query = query.Where(q => q.first.Contains(first));
if (!string.IsNullOrWhiteSpace(last))
query = query.Where(q => q.last.Contains(last));
//.. around 50 additional criteria
return query.ToList();
此代码在 sql server 中产生类似于以下内容(为了更容易理解,我进行了简化)
SQL
SELECT
[Id],
[FirstName],
[LastName],
...etc
FROM [dbo].[Names]
WHERE [FirstName] LIKE '%first%'
AND [LastName] LIKE '%last%'
我现在正在尝试添加一种方法,通过 Entity Framework 使用 C# 生成以下 SQL,但使用 OR 而不是 AND,同时仍然能够动态添加标准。
SQL
SELECT
[Id],
[FirstName],
[LastName],
...etc
FROM [dbo].[Names]
WHERE [FirstName] LIKE '%first%'
OR [LastName] LIKE '%last%' <-- NOTICE THE "OR"
通常一个查询的条件不会超过两个或三个项目,但将它们组合成一个巨大的查询是不可取的。我已经尝试过 concat、union 和 intersect,它们都只是复制查询并用 UNION 加入它们。
是否有一种简单明了的方法可以使用 Entity Framework 将“或”条件添加到动态生成的查询中?
使用我的解决方案进行编辑 - 2015 年 9 月 29 日
自从发布这个之后,我注意到这个问题受到了一些关注,所以我决定发布我的解决方案
// Make sure to add required nuget
// PM> Install-Package LinqKit
var searchCriteria = new
{
FirstName = "sha",
LastName = "hill",
Address = string.Empty,
Dob = (DateTime?)new DateTime(1970, 1, 1),
MaritalStatus = "S",
HireDate = (DateTime?)null,
LoginId = string.Empty,
};
var predicate = PredicateBuilder.False<Person>();
if (!string.IsNullOrWhiteSpace(searchCriteria.FirstName))
{
predicate = predicate.Or(p => p.FirstName.Contains(searchCriteria.FirstName));
}
if (!string.IsNullOrWhiteSpace(searchCriteria.LastName))
{
predicate = predicate.Or(p => p.LastName.Contains(searchCriteria.LastName));
}
// Quite a few more conditions...
foreach(var person in this.Persons.Where(predicate.Compile()))
{
Console.WriteLine("First: {0} Last: {1}", person.FirstName, person.LastName);
}
最佳答案
您可能正在寻找类似 Predicate Builder 的内容这使您可以更轻松地控制 where 语句的 AND 和 OR。
还有 Dynamic Linq它允许您像提交 SQL 字符串一样提交 WHERE 子句,它会将其解析为 WHERE 的正确谓词。
关于c# - Entity Framework 中带有 OR 条件的动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20054742/
我是一名优秀的程序员,十分优秀!