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

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

当用户想要按产品过滤我因为No property or field 'PRODUCTS' exists in type 'ICollection 1 No property or field 'PRODUCTS' exists in type 'ICollection而收到错误

我正在写这样的查询。

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

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

谢谢。

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

如果ORDERS类属性ORDER_DETAILSORDER_DETAILS类的集合,并且ORDER_DETAILS类属性PRODUCTS是具有字符串属性HEADINGSPRODUCTS类的单个对象,则以下应该执行以下操作:

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

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

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

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

你可以试试:

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

现在看来你有这个问题中描述的问题 。 希望它现在运作良好。