c# – 如何在选择视图模型时在IQueryable中添加新的where条件?
我对C#和.Net相当新,所以如果事情没有意义,我会道歉,我会尽力解释我的问题.
我有两种方法,基本上将使用类似的查询但略有不同.因此,我没有在两个方法中重复查询,而是创建了第三个私有方法,它将返回查询的公共部分,然后函数可以根据需要在查询中添加更多子句. 这是一个泛型函数,它返回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,因为我的记录将映射到ViewModel,LINQ将尝试查找ViewModel而不是数据库列的道具. 现在我有两个问题, >在我阅读的文档中,实体框架只会在我尝试使用ToList等方法获取结果时运行查询,如果我没有这样做,为什么它不允许我在数据库字段上应用条件/ 解决方法
以下代码怎么样:
(类型Offer应该由Db.Offers持有的Elements类型替换) 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(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |