目前不支持 IQueryable Intersect

IQueryable Intersect is currently not supported

当我尝试这样做时

//data.Photos it's IEnumerable<Photo>. Comparer worked by Id.
List<Photo> inDb = db.Photos
                     .Intersect(data.Photos, new PhotoComparer())
                     .ToList();

我遇到异常:

NotSupportedException: Could not parse expression

'value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[ReportViewer.Models.DbContexts.Photo]).Intersect(__p_0, __p_1)'
This overload of the method #x27;System.Linq.Queryable.Intersect' is currently not supported.

// This works
List<Photo> inDb = db.Photos
                     .ToList()
                     .Intersect(data.Photos, new PhotoComparer())
                     .ToList();

// But will it take a long time - or not ? 

我需要什么才能将 Intersect 与 IQueryable 和 IEnumerable 集合一起使用?

由于“自定义比较器”,虽然它的功能可能微不足道,但框架目前无法将您的语句翻译成 SQL(我怀疑您正在使用)。

接下来,您似乎有一个内存中的集合,您要对其执行此交集。

因此,如果您想知道速度,为了让它正常工作,您需要将数据发送到数据库服务器,然后根据 Id 检索数据。

所以基本上,您正在寻找一种执行内部联接的方法,这相当于 SQL 相交。

你可以用流动的 linq 查询来做什么:

//disclaimer: from the top of my head
var list= from dbPhoto in db.Photos
                 join dataPhoto in data.Photos on dbPhoto.Id equals dataPhoto.Id
                 select dbPhoto;

虽然这不会起作用,因为据我所知,EF 无法对内存中的数据集执行 join


因此,您也可以:

  • 获取数据作为 IEnumerable(但是是的,您将首先检索整个集合)
  • 使用 Contains,但要小心,如果你不使用原始类型,这可能会转化为一堆 SQL OR 语句

但基本上这取决于您查询的数据量。您可能需要重新考虑您的设置并尝试能够根据某些所有权(例如用户或其他方式)查询数据。