我对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
。产品通过链接表链接到另一个表,一旦我理解了如何执行此示例,我将需要包含该链接表。
非常感谢任何帮助!
由于
答案 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)")