c# - 选择 View 模型时如何在 IQueryable 中添加新的 where 条件?

标签 c# asp.net .net

我是 C# 和 .Net 的新手,所以如果有什么不明白的地方,我深表歉意,我会尽力解释我的问题。

我有两种方法,它们基本上将使用类似的查询,但略有不同。因此,我没有在这两种方法中重复查询,而是创建了第三个私有(private)方法,该方法将返回查询的公共(public)部分,然后函数可以根据需要在查询中添加更多子句。

这是一个通用函数,它返回具有查询公共(public)部分的 IQueryable 对象

private IQueryable<OfferViewModel> GetOffersQueryForSeller(int sellerId)
{
    return Db.Offers
        .Where(o => o.Sku.SellerId == sellerId && o.IsActive && !o.IsDiscontinued)
        .Select(o => new OfferViewModel
        {
            Id = o.Id,
            Name = o.Sku.Name,
            ImageUrl = o.Sku.ImageUrl ?? o.Sku.Upcq.Upc.ImageUrl,
            QuantityName = o.Sku.QuantityName
        });
} 

下面是重用IQueryable对象的两个方法

public async Task<List<OfferViewModel>> GetSellerOffers(int sellerId)
{
    var query = GetOffersQueryForSeller(sellerId);
    return await query.ToListAsync();
}

public async Task<List<OfferViewModel>> GetDowngradableSellerOffers(int sellerId)
{
    var query = GetOffersQueryForSeller(sellerId);
    return await query
        .Where(o => o.Sku.Id == monthlySkuId)
        .ToListAsync();
}

现在 GetSellerOffers 工作正常,但是 GetDowngradableSellerOffers 抛出运行时错误消息 LINQ to Entities 不支持指定的类型成员“Sku”。。我四处询问,其中一个人告诉我,在添加使用 ViewModelselect 之后,我无法添加额外的 where,因为这样我的记录就会被映射到 ViewModel 并且 LINQ 将尝试查找 ViewModel 的属性而不是数据库列。

现在我有两个问题,

  1. 在我阅读的文档中, Entity Framework 将仅在我尝试使用 ToList 等方法获取结果时运行查询,如果我没有这样做,为什么它不允许我在数据库字段上应用条件/

  2. 如何在我的场景中重用通用查询?

最佳答案

下面的代码怎么样:
(Offer 类型应替换为 Db.Offers 持有的元素类型)

private IQueryable<OfferViewModel> GetOffersQueryForSeller(int sellerId, Func<Offer,bool> whereExtension)
{
    return Db.Offers
        .Where(o => ... && whereExtension.Invoke(o))
        .Select(o => new OfferViewModel { ... });
}

private IQueryable<OfferViewModel> GetOffersQueryForSeller(int sellerId)
{
    return GetOffersQueryForSeller(sellerId, (o) => true);
}

然后在 GetDowngradableSellerOffers 中这样调用它:

public async Task<List<OfferViewModel>> GetDowngradableSellerOffers(int sellerId)
{
    var query = GetOffersQueryForSeller(sellerId, (o) => o.Sku.Id == monthlySkuId);
    return await query.ToListAsync();
}

关于c# - 选择 View 模型时如何在 IQueryable 中添加新的 where 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50364098/

相关文章:

jquery - 我是否应该担心找不到引用的 *.js 文件?如果是这样,我该怎么办?

asp.net - Google reCAPTCHA 响应成功 : false, 无错误代码

c# - 有没有办法在不使用 System.Management.Automation 的情况下捕获 powershell 脚本执行的输出

c# - 解决文件路径太长异常的最佳方法

c# - 每次使用innerHTML或jquery html()渲染页面的一部分时如何防止页面滞后/挂起

c# - 为什么我没有收到 ref 关键字的错误

c# - 通过对 SQL 数据库的一次调用检索两个级别的数据

c# - Visual Studio express : free class diagram tool

c# - 使用 Windows.System 命名空间添加 CsWinRT nuget 中断

.net - 在 .NET 中,我的 app.config 设置的运行时等效项是什么?