我正在尝试过滤用户请求的结果。例如,你有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();
所以不可能像这样过滤子集合?或者有任何过滤的方法吗?
谢谢。
从您命名类/属性的方式来看,很难猜测哪个是单个对象,哪个是集合属性。
如果ORDERS
类属性ORDER_DETAILS
是ORDER_DETAILS
类的集合,ORDER_DETAILS
类属性PRODUCTS
是PRODUCTS
类的单个对象,具有字符串属性HEADINGS
,则以下操作应该可以实现:
.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<ORDERS>()
.Query()
.Where("PRODUCTS.HEADING.ToLower().Contains("foo")")
.Include(x=>x.ORDER_DETAILS.Select(y => y.PRODUCTS));
看来你现在遇到了问题中所描述的问题。