gpt4 book ai didi

c# - 使用不为空的对象属性的 EF6 查询条件

转载 作者:太空狗 更新时间:2023-10-30 00:18:17 25 4
gpt4 key购买 nike

我有一个来自 MVC 提交的 View 模型类,我想根据用户填写的值从 EF6 获取结果集,但忽略模型中为空的那些项目:

public class SearchFilterVM
{
public int? ID { get; set; }
public bool? Active { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string MiddleInitial { get; set; }
public DateTime? DateOfBirth { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
}

基本上我正在寻找的是类似这样的伪代码:

var results = context.Members
.Where(x => x.Active == vm.Active.Value) // but only if vm prop is not null
.Where(x => x.FirstName == vm.FirstName) // but only if vm prop is not null
.Where(x => x.LastName == vm.LastName) // but only if vm prop is not null
.ToList();

(例如,如果过滤器模型属性为空,则完全忽略它们)

当然我不想使用类似上面的东西,因为它会根据第一个条件进行查询,然后根据第二个适用的条件重新查询,等等,直到完成(我正在处理 500k+ 行)。

我也想不出为此使用 LINQ 查询表达式的方法。

我可以做的是根据值的存在构建一个参数化的 SQL 语句并附加条件,最后通过 EF6 的 RawSQLQuery 传递它,这将在性能方面发挥作用(并让我很好地控制索引字段的顺序为了更好地调整),但我想知道是否有一种“自然”的方式通过 LINQ 完成同样的事情。

最佳答案

我推荐的方法

请记住,EF 使用延迟执行,您实际上不会执行任何查询,直到您使用 ToList() 实现它或对其进行迭代等。这意味着您可以这样做:

var results = context.Members;

if(vm.Active.HasValue)
{
results = results.Where(x => x.Active == vm.Active.Value);
}

if(!string.IsNullOrEmpty vm.FirstName))
{
results = results.Where(x => x.FirstName == vm.FirstName);
}

//and so on until...

return results.ToList();

其他方法

我想我会添加这个额外的免费赠品,以了解为什么您可能不想使用其他答案中提到的技术。假设您这样做了:

string name = "bob";

var users = context.Users.Where(u => name == null || u.Name == name).ToList();

这看起来与我的版本非常相似,并且会给出相同的结果,但 SQL 查询却大不相同。你最终会得到这样的结果:

DECLARE @p__linq__0 NVarChar(1000) = 'bob'
DECLARE @p__linq__1 NVarChar(1000) = 'bob'

SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
/* snip */
FROM [dbo].[Users] AS [Extent1]
WHERE @p__linq__0 IS NULL OR [Extent1].[Name] = @p__linq__1

请注意,空检查现在已在数据库中完成,并且您还两次发送了参数。好的,它可能不会明显变慢,但您可能希望将来牢记这一点。

关于c# - 使用不为空的对象属性的 EF6 查询条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39979864/

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