Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ2实体、多对多和动态where子句_C#_Linq_Linq To Entities_Lambda - Fatal编程技术网

C# LINQ2实体、多对多和动态where子句

C# LINQ2实体、多对多和动态where子句,c#,linq,linq-to-entities,lambda,C#,Linq,Linq To Entities,Lambda,我是Linq的新手,在多对多关系中使用dynamic where很困难 数据库表如下所示: 产品产品子类别子类别 将产品\u子类别作为链接表 我完整的linq声明是 db.Products.Where("it.SubCategories.SubCategoryID = 2") .Include("SubCategories") .OrderBy(searchOrderBy) .Sk

我是Linq的新手,在多对多关系中使用dynamic where很困难

数据库表如下所示:

产品产品子类别子类别

产品\u子类别
作为链接表

我完整的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风格的语法,我可以按照进行子查询。然而,我不知道如何在lambda/链接语法中做到这一点

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

任何帮助都将不胜感激

谢谢这是错误的:

db.Products.Where("it.SubCategories.SubCategoryID = 2")
子类别
是一个列表。它没有名为
子类别ID
的属性。相反,它包含一组实体,每个实体都有一个名为
SubCategoryID
的属性。这是一个关键的区别

当你遇到一种情况,你不知道如何继续在有多个问题,它是好的,分解成几个小问题的问题

让我们从删除动态查询开始。使用非动态查询将更容易解决问题。一旦你做到了这一点,你可以回去,使它再次充满活力

因此,从使用非动态语法开始。在Visual Studio中键入类似的内容,然后查看IntelliSense为您做了什么:

db.Products.Where(p => p.SubCategories.
您将很快看到没有
子类别id
属性。相反,您将看到一组用于处理列表的LINQAPI方法。如果您非常了解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(“Dynamic LINQ”)来处理这类事情,而不是使用查询生成器,因为它更易于测试。

它对我很有用

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

谢谢克雷格,思路清晰,工作顺利。我把自己逼到了一个角落!当我通过一个SP合并FT搜索时,我改变了很多实现方式,但这有助于我的理解。很好的答案,正是我想要的