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



我正在尝试过滤用户请求的结果。例如,你有ordersorder 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_DETAILSORDER_DETAILS类的集合,ORDER_DETAILS类属性PRODUCTSPRODUCTS类的单个对象,具有字符串属性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));

看来你现在遇到了问题中所描述的问题。

相关内容

  • 没有找到相关文章

最新更新