Linq2Entities,多对多和动态where子句

时间:2010-02-10 11:27:31

标签: c# linq linq-to-entities lambda

我对Linq很新,并且在多对多的关系中努力使用动态。

数据库表是这样的:

产品< - > Products_SubCategories< - >子类别

Products_SubCategories是链接表。

我的完整linq声明是

 db.Products.Where("it.SubCategories.SubCategoryID = 2")
                   .Include("SubCategories")
                   .OrderBy(searchOrderBy)
                   .Skip(currentPage * pageSize)
                   .Take(pageSize)
                   .ToList()
                   .ForEach(p => AddResultItem(items, p));

所以忽略所有内容吧Where()我只想提取链接到子类别ID 2的所有产品,这会失败

  

要从集合中提取属性,必须使用子查询来迭代集合。,靠近多部分标识符,第8行,第1列。

我认为使用SQL-esque语法我可以根据this link执行子查询。但是我不确定如何在lambda / chaining语法中这样做。

这是搜索功能的开始,我想动态建立where字符串,就像我使用searchOrderBy字符串一样,以避免大SELECT CASE。产品通过链接表链接到另一个表,一旦我理解了如何执行此示例,我将需要包含该链接表。

非常感谢任何帮助!

由于

2 个答案:

答案 0 :(得分:5)

这是错误的:

db.Products.Where("it.SubCategories.SubCategoryID = 2")

SubCategories是一个列表。它没有名为SubCategoryID的属性。相反,它包含一组实体,每个实体都有一个名为SubCategoryID的属性。这是一个至关重要的区别。

当你遇到一个你不知道如何进行的情况时会出现多个问题,最好将问题分解为几个较小的问题。

让我们从删除动态查询开始。使用非动态查询解决问题会更容易。完成后,您可以返回并再次使其动态化。

首先使用非动态语法。在Visual Studio中键入类似的内容,并查看IntelliSense为您做的事情:

db.Products.Where(p => p.SubCategories.

您很快就会发现没有SubCategoryID属性。相反,您将看到一堆用于处理列表的LINQ API方法。如果你很了解LINQ,你会发现Any()方法就是你想要的:

db.Products.Where(p => p.SubCategories.Any(sc => sc.SubCategoryID == 2))

继续并运行该查询。它有用吗?如果是这样,您可以继续前进,使其动态化。我不是ESQL专家,但我会从以下方面开始:

db.Products.Where("EXISTS(SELECT SC FROM it.SubCategories AS SC WHERE SC.SubCategoryID = 2");

顺便说一下,我使用MS Dynamic Query(“动态LINQ”)来做这类事情而不是查询生成器,因为它更容易测试。

答案 1 :(得分:0)

它对我有用。

db.Products.Where("SubCategories.Any(SubCategoryID = 2)")