【发布时间】:2019-08-15 16:03:15
【问题描述】:
在有人将标记视为重复之前,我已经查看了每个人都在做的事情比我尝试的要复杂一些。
所以我正在开发一个数据库,其中有很多数据要检查,而 LINQ 的 Any() 扩展转换为 SQL 不如 SQL 的 Count(1) > 0 快,所以我在写的任何地方:
var someBool = Ctx.SomeEntities.Count(x => x.RelatedEntity.Count(y => y.SomeProperty == SomeValue) > 0) > 0;
在伪中:我的任何实体是否与具有值为 SomeValue 的属性的某个其他实体有关系。
这很好用,而且运行速度很快。但是,它并不完全可读(我有很多,在某些情况下比嵌入更多)所以我想做的就是将其替换为:
var someBool = Ctx.SomeEntities.AnyX(x => x.RelatedEntity.AnyX(y => y.SomeProperty == SomeValue));
与:
public static bool AnyX<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) => source.Count(predicate) > 0;
所以你看我没有做任何 LINQ 无法转换为 SQL 的事情,我没有做任何 LINQ 尚未转换为 SQL 的事情,而只是通过创建一个额外的扩展我得到:
LINQ to Entities 无法识别 Boolean AnyX 等方法...
必须有某种方式来编写我的扩展程序或某种方式告诉 LINQ 只是为了看看代码,你就会发现你可以做到。
【问题讨论】:
-
你为什么使用 AnyX 而不是 Any?
-
我看到了两个大问题,首先 EF 处理
Expressions,而不是代表;传递Expression<Func<TSource, bool>>而不是Func<TSource, bool>,它需要扩展IQueryable<>,而不是IEnumerable。 -
@Tod 您复制了
Any的 IEnumerable 版本的代码。 IQueryable 版本不同。 IEnumerable版本,IQueryable版本 -
在尝试以这种方式“增强”实体框架时,了解扩展
IEnumerable和IQueryable之间的区别至关重要。如果您在IEnumerable上操作,它将在本地计算机上运行,不会被翻译成 SQL。
标签: c# linq entity-framework-6 extension-methods