如何使用 linq dynamic 过滤子集合

How to filter child collection with linq dynamic

我正在尝试根据用户请求过滤结果。 例如,您有 ordersorder details,而 products 是子集合。

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

而出现错误

我正在这样写我的查询。

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

所以不能像这样过滤子集合?或者有什么过滤方法?

谢谢。

问题是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 中描述的问题。希望它现在运行良好。

根据您给 classes/properties 命名的方式,很难猜出哪个是单个对象,哪个是集合 属性。

如果ORDERSclass属性ORDER_DETAILSORDER_DETAILSclass的集合,而ORDER_DETAILSclass 属性 PRODUCTSPRODUCTS class 的单个对象,有一个字符串 属性 HEADINGS,那么下面应该可以解决问题:

.Where("ORDER_DETAILS.Any(PRODUCTS.HEADING.ToLower().Contains(\"foo\"))")

和跳过lambda参数的静态查询基本一样

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