Entity framework core 重用Where条件

Entity framework core 重用Where条件,entity-framework-core,linq-to-entities,entity-framework-core-3.1,Entity Framework Core,Linq To Entities,Entity Framework Core 3.1,我有以下实体框架查询: IQueryable<Address> addresses = _context.Addresses .Where(x => !(_context.Users.Any(y => y.AddressId == x.Id)) && !(_context.Books.Any(y => y.AddressId == x.Id) && !(_context.Shops.Any(y =>

我有以下实体框架查询:

IQueryable<Address> addresses = _context.Addresses
  .Where(x => 
    !(_context.Users.Any(y => y.AddressId == x.Id)) &&
    !(_context.Books.Any(y => y.AddressId == x.Id) &&
    !(_context.Shops.Any(y => y.AddressId == x.Id));
我经常在这种情况下使用

是否可以以某种形式定义条件并在不同查询中重用它:

IQueryable<Address> addresses = _context.Addresses.Where(AddressCondition);
我正在考虑使用表达式和函数


问题是该条件使用了DbContext\u context。

地址表似乎与用户、图书和商店表有1:M的关系。假设地址实体有用户、书籍和商店集合,您可以使用!address.Users.Any查找没有匹配用户的地址等

您可以将整个操作提取到一个函数中,该函数接收原始IQueryable,应用Where运算符并返回新的IQueryable,例如:

IQueryable<Address> OrphanedOnly(IQueryable<Address> query)
{
    return query.Where(address=>!address.Users.Any() &&
                                !address.Books.Any() &&
                                !address.Shops.Any());
}

这是否在EF Core 3.1中运行?这是一个丑陋的查询开始-它试图模拟没有连接的左连接。如果实体是相关的,使用适当的关系并让ORM生成连接。这一个本质上是三个独立的左连接,试图找到没有关系的地址。显示左连接是否具有lambda表达式?你能举个例子吗?这就是我要找的,然后使用表达式忘记lambdas和funcs。您也不需要这样做,如果您没有像这样使用DbContext,您可以编写一个函数来接收一个IQueryable,应用Where子句并返回结果。该查询需要修复。它试图模拟3个不存在子查询,这相当于3个带有空检查的左连接。不过,ORM的工作是生成这些连接。坦率地说,最好使用SQL视图或函数来实现这一点,而不是尝试通过LINQ模拟SQL查询。LINQ不是SQL的替代品,它看起来像是地址表与用户、书籍和商店表之间有1:M的关系。为了表示这一点,地址实体应该有用户、书籍和商店集合。这将允许您编写例如whereddr=>!addr.Users.Any&&!地址。书籍。任何。。。。现在,我可以理解商店和用户都有地址,但是书呢?你想干什么?如果您想查找孤立地址,最好只编写一个视图或存储过程,当然。。。我想我可以通过收集来检查它。