C# IQueryable Intersect当前不受支持

C# IQueryable Intersect当前不受支持,c#,linq,exception,intersect,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(); //data.Photos它是IEnumerable。比较器由Id工作。 List inDb=db.Photos.Intersect(data.Photos,ne

当我试着这么做的时候

//data.Photos it's IEnumerable<Photo>. Comparer worked by Id.
List<Photo> inDb = db.Photos.Intersect(data.Photos, new PhotoComparer()).ToList();
//data.Photos它是IEnumerable。比较器由Id工作。
List inDb=db.Photos.Intersect(data.Photos,new PhotoComparer()).ToList();
我有个例外

NotSupportedException:无法分析表达式 '值(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable'1[ReportViewer.Models.DbContexts.Photo])。Intersect(u 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 ? 
//这很有效
List inDb=db.Photos.ToList().Intersect(data.Photos,new PhotoComparer()).ToList();
//但这是很长时间还是很短?
我需要在IQueriable和IEnumerable集合中使用什么

由于“自定义比较器”,尽管它的功能可能微不足道,但该框架目前无法将您的语句转换为SQL(我怀疑您正在使用SQL)

接下来,您似乎有一个内存中的集合,您希望在该集合上执行此交集

因此,如果您对速度感到好奇,为了使其正常工作,您需要将数据发送到数据库服务器,并根据Id检索数据

因此,基本上,您正在寻找一种执行内部联接的方法,这将是与intersect相当的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的形式获取数据(但是是的,您将首先检索整个集合)
  • 使用
    包含
    ,但要小心,如果您不使用基元类型,这可能会转换为一堆SQL
    语句

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

不,您不能在IQuerable服务器上执行此操作,支持IComparable将要求查询提供程序将任意IL转换为SQL,它无法查看以下内容:是的,完全联接是正确的,但我在寻找一种简化代码的方法。现在我想这不是一个更好的主意。你也可以看一看,但是,最终还是要看你的数据集到底有多大。这类数据通常是用户绑定的,也许您可以查询特定用户的数据。