使用LINQ动态如何筛选子集合

4

我正在尝试为用户请求过滤结果。

例如,您有ordersorder detailsproducts是子集合。

当用户想要按产品进行过滤时,由于类型ICollection1中不存在属性或字段PRODUCTS而出现错误。

我的查询代码如下:

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

这样过滤子集合是不可能的吗?还是有其他过滤方法?
谢谢。

你不需要使用 .Include("ORDER_DETAILS"),只需要使用 .Include("ORDER_DETAILS.PRODUCTS") 即可。你可以尝试不加 .Include("ORDER_DETAILS") 这一行代码,看看会发生什么。 - meJustAndrew
表格的顺序应该是 ORDERS -> ORDER_DETAILS -> PRODUCTS。因此,我必须包括 ORDER_DETAILS,因为它包含 productID。 - Kadir
我了解,但请查看MSDN示例,他们说在您的情况下,如果您只使用.Include("ORDER_DETAILS.PRODUCTS"),那么ORDER_DETAILS将被包含在内。 - meJustAndrew
是的,你说得对。 - Kadir
根据评论,我已经添加了一个答案。 - meJustAndrew
显示剩余2条评论
2个回答

3
从你命名类和属性的方式来看,很难猜出哪个是单一对象,哪个是集合属性。
如果 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")))

太棒了,非常感谢。我没有意识到使用实体框架的任何表达式与linq动态是如此简单。 - Kadir
快速问题,我可以在order by中使用where条件吗?用法相同吗? - Kadir
我猜是这样,但不确定百分之百。你知道,这是试错的经验 :) - Ivan Stoev
结果发现它不被支持:(包括"FirstOrDefault"和类似的都不支持。基本上,唯一支持的是AnyAllCountMinMaxSumAverage - Ivan Stoev
是的,当我写任何一个或者firstordefault时,它会报错"不存在适用的聚合方法'FirstOrDefault'"。 - Kadir

0
问题在于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));

看起来你现在遇到了这个问题所描述的问题。希望现在能够顺利解决。


我想我在这里找到了一个解决方案。https://dev59.com/FKjns4cB2Jgan1znRMXg。但仍在努力中。 - Kadir
抱歉回复晚了(我们国家放假了)。实际上,我们无法完成您的解决方案,因为在foreach循环中,顺序是实际项目。我们不能在那里使用Include方法或linq函数。顺便说一下,那个unitofwork返回IQuerable。 - Kadir
真的吗,使用 Select 语句? - meJustAndrew
@Kadir 我非常确定这应该可以工作,你能再试一次并随时告诉我最新情况吗? - meJustAndrew
没有,结果一样。 - Kadir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接