我是 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”。
。我四处询问,其中一个人告诉我,在添加使用 ViewModel
的 select
之后,我无法添加额外的 where
,因为这样我的记录就会被映射到 ViewModel
并且 LINQ
将尝试查找 ViewModel
的属性而不是数据库列。
现在我有两个问题,
在我阅读的文档中, Entity Framework 将仅在我尝试使用
ToList
等方法获取结果时运行查询,如果我没有这样做,为什么它不允许我在数据库字段上应用条件/如何在我的场景中重用通用查询?
最佳答案
下面的代码怎么样:
(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/