Jam*_*min 3 c# linq lambda linq-to-entities
我对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));
Run Code Online (Sandbox Code Playgroud)
所以忽略了一切,Where()我只是试图提取所有链接到子类别ID 2的产品,这就失败了
要从集合中提取属性,必须使用子查询迭代集合.,靠近多部分标识符,第8行,第1列.
我认为使用SQL-esque语法我可以根据此链接执行子查询.但是我不确定如何在lambda/chaining语法中这样做.
这是搜索功能的开始,我想动态地建立where字符串,因为我有searchOrderBy字符串以避免大SELECT CASE.产品通过链接表链接到另一个表,一旦我了解如何执行此示例,我将需要包含该链接表.
任何帮助将非常感激!
谢谢
这是错的:
db.Products.Where("it.SubCategories.SubCategoryID = 2")
Run Code Online (Sandbox Code Playgroud)
SubCategories是一个清单.它没有名为的属性SubCategoryID.相反,它包含一组实体,每个实体都有一个名为的属性SubCategoryID.这是一个至关重要的区别.
如果遇到不知道如何进行的情况,则存在多个问题,最好将问题分解为几个较小的问题.
让我们从删除动态查询开始.使用非动态查询解决问题会更容易.完成后,您可以返回并再次使其动态化.
因此,首先使用非动态语法.在Visual Studio中键入类似的内容,并查看IntelliSense为您执行的操作:
db.Products.Where(p => p.SubCategories.
Run Code Online (Sandbox Code Playgroud)
你很快就会发现没有SubCategoryID财产.相反,您将看到一堆用于处理列表的LINQ API方法.如果你很了解LINQ,你会发现这个Any()方法就是你想要的:
db.Products.Where(p => p.SubCategories.Any(sc => sc.SubCategoryID == 2))
Run Code Online (Sandbox Code Playgroud)
继续运行该查询.它有用吗?如果是这样,您可以继续前进,使其动态化.我不是ESQL专家,但我会从以下方面开始:
db.Products.Where("EXISTS(SELECT SC FROM it.SubCategories AS SC WHERE SC.SubCategoryID = 2");
Run Code Online (Sandbox Code Playgroud)
顺便说一下,我使用MS动态查询("动态LINQ")来做这类事情而不是查询生成器,因为它更容易测试.