如何使用linq动态过滤子集合

时间:2016-06-30 08:54:04

标签: c# linq dynamic-linq

我试图过滤用户请求的结果。 例如,您有ordersorder detailsproducts是子集合。

当用户想要按产品过滤时,由于No property or field 'PRODUCTS' exists in type 'ICollection 1'`

而导致错误

我正在写这样的查询。

var orders = _uow.Repository<ORDERS>()
    .Query()
    .Where("PRODUCTS.HEADING.ToLower().Contains(\"foo\")")
    .Include("ORDER_DETAILS")
    .Include("ORDER_DETAILS.PRODUCTS")
    .ToList();

所以不可能像这样过滤子集合吗?或者任何方式来过滤?

感谢。

2 个答案:

答案 0 :(得分:3)

从命名类/属性的方式来看,很难猜出哪一个是单个对象,哪一个是集合属性。

如果ORDER_DETAILS类属性ORDER_DETAILSORDER_DETAILS类的集合,则PRODUCTS类属性PRODUCTSHEADINGS的唯一对象具有字符串属性.Where("ORDER_DETAILS.Any(PRODUCTS.HEADING.ToLower().Contains(\"foo\"))") 的类,那么以下应该可以做到这一点:

.Where(o => o.ORDER_DETAILS.Any(d => d.PRODUCTS.HEADING.ToLower().Contains("foo")))

它与跳过lambda参数的静态查询基本相同

ROWID

答案 1 :(得分:0)

问题是ORDER_DETAILS是一个列表,每个订单明细都有一个产品列表?这就是您收到错误消息的原因。为了从ORDER_DETAILS获取产品,您需要遍历它并从每个元素中获取产品。

您可以尝试:

var orders = _uow.Repository<ORDERS>()
    .Query()
    .Where("PRODUCTS.HEADING.ToLower().Contains(\"foo\")")
    .Include(x=>x.ORDER_DETAILS.Select(y => y.PRODUCTS));

现在看来你遇到了this question中描述的问题。希望它现在运作良好。