如何使用 linq dynamic 过滤子集合
How to filter child collection with linq dynamic
我正在尝试根据用户请求过滤结果。
例如,您有 orders
和 order details
,而 products
是子集合。
当用户想要按产品过滤时,由于 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();
所以不能像这样过滤子集合?或者有什么过滤方法?
谢谢。
问题是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 命名的方式,很难猜出哪个是单个对象,哪个是集合 属性。
如果ORDERS
class属性ORDER_DETAILS
是ORDER_DETAILS
class的集合,而ORDER_DETAILS
class 属性 PRODUCTS
是 PRODUCTS
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")))
我正在尝试根据用户请求过滤结果。
例如,您有 orders
和 order details
,而 products
是子集合。
当用户想要按产品过滤时,由于 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();
所以不能像这样过滤子集合?或者有什么过滤方法?
谢谢。
问题是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 命名的方式,很难猜出哪个是单个对象,哪个是集合 属性。
如果ORDERS
class属性ORDER_DETAILS
是ORDER_DETAILS
class的集合,而ORDER_DETAILS
class 属性 PRODUCTS
是 PRODUCTS
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")))