c# - Entity Framework Core - 在 Queryable 中使用扩展方法

标签 c# entity-framework entity-framework-core

我有以下查询:

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 查询时,一切似乎都正常,但是当我使用第二种方法时,检查状态的查询部分不存在。

最佳答案

试试这个方法,它会创建 ExpressionPackage 作为输入,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/

相关文章:

c# - 自动化测试中的 DbContext.ChangeTracker 抛出 SQLException

c# - 当实体的 id 是不同类型(string/int)时,如何创建 CRUD 存储库?

c# - EF Core 5.0 - 如何在迁移中使用 List<string> 属性播种实体?

c# - 在 ASP MVC 中传递 NULL 的值

c# - 编译时在输出窗口中查看所有命令行

c# - 在大图像中查找 16x16 像素相同正方形的有效算法 - C#

entity-framework-core - ef7 接受字符串路径的 DbSet.Include 运算符

c# - WPF:有没有办法进行内联格式化?

c# - 在 Entity-Framework 中使用更新的 DatabaseGeneratedOption 迁移实体

c# - 身份用户管理器 DeleteAsync DbUpdateConcurrencyException