EF Core连接实体IQueryable与id IQueryable

本文关键字:IQueryable id 实体 Core 连接 EF | 更新日期: 2023-09-27 18:15:38

我尝试加入IQueryable<int>,这是一个具有IQueryable<Entity>的实体id列表。

我使用以下代码:

IQueryable<Entity> entityQuery = _context.Entities.Where(x => ...);
IQueryable<int> idQuery = _context.AccessRights.Where(x => ...).Select(x => x.Id);
query = entityQuery.Join(idQuery, x => x.Id, x => x, (x, y) => x);

这段代码在内存列表中工作,但是如果我尝试用LINQ to sql, Join会被忽略。

我不想把id加载到内存中。这甚至可能与LINQ到SQL吗?

EF Core连接实体IQueryable与id IQueryable

你可以这样做:

IQueryable<Entity> entityQuery = _context.Entities.Where(x => ...);
IQueryable<int> idQuery = _context.AccessRights.Where(x => ...).Select(x => x.Id);
entityQuery = entityQuery.Where(x => idQuery.Contains(x.Id));

这将得到您正在寻找的结果,而无需将id加载到内存中。但是它可能会把它转换成一个巨大的SQL IN语句,这是不理想的。

或者您可以直接加入AccessRights:

IQueryable<Entity> entityQuery = from e in _context.Entities.Where(x => ...)
                                 join ar in _context.AccessRights.Where(x => ...)
                                     on e.Id equals ar.Id
                                 select e;