如何使用linq动态过滤子集合
我正在尝试过滤用户请求的结果。 例如,您有orders
和order details
, products
是子集合。
当用户想要按产品过滤我因为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_DETAILS
是ORDER_DETAILS
类的集合,并且ORDER_DETAILS
类属性PRODUCTS
是具有字符串属性HEADINGS
的PRODUCTS
类的单个对象,则以下应该执行以下操作:
.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));
现在看来你有这个问题中描述的问题 。 希望它现在运作良好。