我有以下查询:
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()
}
关于c# - Entity Framework Core - 在 Queryable 中使用扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54512134/