c# - Entity Framework Core - 在 Queryable 中使用扩展方法
问题描述
我有以下查询:
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 查询时,一切似乎都很好,但是当我使用第二种方法时,检查状态的查询部分不存在。
解决方案
试试这个方法,它将创建Expression
,Package
作为输入和bool
输出:
public static System.Linq.Expressions.Expression<Func<Package, bool>> IsShippedOrInProgress()
{
return p => p.StatusId == ( int )PackageStatus.InProgress ||
p.StatusId == ( int )PackageStatus.Delivered ||
p.StatusId == ( int )PackageStatus.Shipped ||
p.StatusId == ( int )PackageStatus.Waiting);
}
像这样称呼它:
private void SomeMethod()
{
db.Users.AsQueryable()
.Where(u => u.Id = userResolver.LoggedUserId() &&
u.Packages.Where(IsShippedOrInProgress())
.Sum(p => p.Price) > u.MaxCredit)
.ToList()
}
推荐阅读
- python - 乘法时的Python递归错误
- jwt - 如何从外部服务生成的传入 JWT 中提取信息?
- sql-server - SQL Server FOR XML 行合并行
- c++ - 使用来自另一个模板的参数的 Currying 模板
- r - 使用 R 连接到 Youtube Analytics API
- sql-server - SSIS 使用 SQL 表中的不同数据向不同的收件人发送电子邮件
- javascript - Redux:如何组织多个选择器?
- compiler-errors - LLVM “/manifestdependency: is not allowed in .drectve” 解决方法
- php - 对友好的 url 使用 htaccess modrewrite 会产生 404 错误
- c++ - g++ - 链接阶段(-L 标志)不起作用