当我尝试这样做
//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集合一起使用吗?
答案 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
。
因此,您也可以:
Contains
,如果您不使用原始类型,则可以转换为一堆SQL OR
语句但是基本上,这取决于您要查询的数据量。您可能需要重新考虑设置,并尝试能够基于某些所有权(例如用户或其他方式)查询数据。