使用另一个表的结果过滤IQueryable

时间:2017-11-01 03:56:45

标签: c# entity-framework

我有一个EF查询,它从数据库中获取产品。

var query = (from pPrice in db.ProductPricing
             join prod in db.Products on pPrice.ProductID equals prod.ProductID
             join productExt in db.ProductsExt on prod.ProductID equals productExt.ProductID into pExts
             from prodExt in pExts.DefaultIfEmpty()
             where (includeNonPublic || pPrice.ShowOnline == 1)
                 && ((eventID.HasValue && pPrice.EventID == eventID) || (!eventID.HasValue && !pPrice.EventID.HasValue))
             orderby prod.DisplayOrder
             select new ProductPricingInfo()
             {
                 Product = prod,
                 ProductPricing = pPrice,
                 ProductExtension = prodExt
             });

我有一张桌子,我可以指定附加产品(一旦购买了父项,就可以购买的产品)。

我提取这些附加产品的查询是

var addOnProductsQuery = (from pa in db.ProductAddons
                         where pa.EventID == eventID && pa.StatusID == 1
                         select new { ProductID = pa.ChildProductId });

现在我要做的是过滤查询变量,只返回不在addOnProductsQuery结果中的产品。

目前我有

var addOnProducts = addOnProductsQuery.ToList();
query = query.Where(e => !addOnProducts.Contains(e.Product.ProductID));

但是Contains(e.Product.ProductID)语句中存在语法错误

  • 参数1:无法从int转换为匿名类型:int ProductID

1 个答案:

答案 0 :(得分:0)

Chetan在评论中是正确的,您需要在使用Contains之前从对象中选择整数。

您可以通过两种方式实现:

首先你可以先取整数:

var addOnProductsQuery = (from pa in db.ProductAddons
                     where pa.EventID == eventID && pa.StatusID == 1
                     select new pa.ChildProductId);

这应该为int提供类型,以便您以后可以使用Contains而没有任何问题。

其次,如果你想保持addOnProductsQuery不变:

var addOnProducts = addOnProductsQuery.Select(a => a.ProductID).ToList();
query = query.Where(e => !addOnProducts.Contains(e.Product.ProductID));