gpt4 book ai didi

c# - Entity Framework 中带有 OR 条件的动态查询

转载 作者:IT王子 更新时间:2023-10-29 04:05:09 25 4
gpt4 key购买 nike

我正在创建一个搜索数据库并允许用户动态添加任何条件(大约 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com