当前不支持IQueryable相交

时间:2019-11-26 05:48:53

标签: c# linq exception intersect

当我尝试这样做

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

我有一个例外。

NotSupportedException:无法解析表达式         '值(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1 [ReportViewer.Models.DbContexts.Photo])。Intersect(__ p_0,         __p_1)':方法'System.Linq.Queryable.Intersect'的此重载当前不存在         支持。

//It's works
List<Photo> inDb = db.Photos.ToList().Intersect(data.Photos, new PhotoComparer()).ToList();
//But it's will be long or not ? 

我需要将Intersect与IQueriable和IEnumerable集合一起使用吗?

1 个答案:

答案 0 :(得分:0)

由于使用“自定义比较器”,尽管它的功能可能微不足道,但该框架目前无法将您的语句转换为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语句

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