【发布时间】:2019-06-27 22:58:11
【问题描述】:
我有以下查询:
db.Users.AsQueryable()
.Where(u => u.Id = userResolver.LoggedUserId() && u.Packages.Where(p =>
p.StatusId == (int)PackageStatus.InProgress ||
p.StatusId == (int)PackageStatus.Delivered ||
p.StatusId == (int)PackageStatus.Shipped ||
p.StatusId == (int)PackageStatus.Waiting)
.Sum(p => p.Price) > u.MaxCredit)
.ToList()
我想要实现的是将所有包状态检查分组到一个扩展方法。类似的东西:
db.Users.AsQueryable()
.Where(u => u.Id = userResolver.LoggedUserId() &&
u.Packages.Where(p => p.IsShippedOrInProgress())
.Sum(p => p.Price) > u.MaxCredit)
.ToList()
//This is the extension method
public static bool IsShippedOrInProgress(this Package p) {
return p.StatusId == (int)PackageStatus.InProgress ||
p.StatusId == (int)PackageStatus.Delivered ||
p.StatusId == (int)PackageStatus.Shipped ||
p.StatusId == (int)PackageStatus.Waiting)
}
当我查看第一个示例中生成的 sql 查询时,一切似乎都正常,但是当我使用第二种方法时,检查状态的查询部分不存在。
【问题讨论】:
-
还有更多代码没有显示吗?
-
是的。其实这只是一个例子。我不能发布真正的代码。我很乐意为您提供您需要的任何东西:-)
-
@TalHumy 更清楚地解释您对这些查询的期望?
-
自定义方法由于显而易见的原因无法转换为 SQL。一种可能的解决方案是使用 3rd 方库,例如 NeinLinq.EntityFrameworkCore:“NeinLinq 扩展了 LINQ 提供程序,例如 Entity Framework,以启用重用函数、重写查询以及使用可翻译的谓词和选择器构建动态查询。”
-
您可能需要探索 EF 如何将您的 C# 代码转换为 SQL 查询。您可以通过让扩展方法返回
Expression<Func<Package, Boolean>>来解决这个问题
标签: c# entity-framework entity-framework-core