在FirstOrDefault()之前筛选结果,然后使用FirstOrDefault()

本文关键字:FirstOrDefault 然后 筛选 结果 | 更新日期: 2023-09-27 18:21:55

我想做这样的事情;

Context.Users.Include("Addresses", a => a.IsRowDeleted == false).FirstOrDefault(u => u.UserId == 5);

我的意思是;我想过滤包含的实体,但并不总是这样,它也必须是可选的。

对此,最好的解决方案是什么?请帮帮我,

在FirstOrDefault()之前筛选结果,然后使用FirstOrDefault()

您无法在EF中筛选急切加载的数据。Include操作不支持筛选或排序。

您必须使用投影到自定义类型(或匿名类型):

var query = from u in context.Users
            where u.UserId == 5
            select new UserFiltered 
                { 
                    User = u,
                    Addresses = u.Addresses.Where(a => !a.IsRowDeleted)
                };
UserFiltered u = query.FirstOrDefault();

或者,您必须将查询划分为两个单独的查询,并使用显式加载:

context.ContextOptions.LazyLoadingEnabled = false;
var user = context.Users.FirstOrDefault(u => u.UserId == 5);
((EntityCollection<Address>)user.Addresses)
     .CreateSourceQuery()
     .Where(a => !a.IsRowDeleted)
     .Execute();               

或者您可以简单地使用两个查询:

var user = context.Users.FirstOrDefault(u => u.UserId == 5);
var addresses = context.Addresses.Where(a => a.User.UserId == 5 && !a.IsRowDeleted).ToList();

你的意思是(警告:未经测试的代码):

Context.Users.SingleOrDefault(u => u.Addresses.Where(a => a.IsRowDeleted == false).Count > 0) && u.UserId == 5);