gpt4 book ai didi

c# - Linq 实体,多对多和动态 where 子句

转载 作者:行者123 更新时间:2023-11-30 15:11:34 25 4
gpt4 key购买 nike

我是 Linq 的新手,并且在多对多关系中使用 dynamic where 时遇到困难。

数据库表是这样的:

产品 <-> Products_SubCategories <-> 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 的产品,这失败了

To extract properties out of collections, you must use a sub-query to iterate over the collection., near multipart identifier, line 8, column 1.

我认为使用类似 SQL 的语法我可以根据 this link 执行子查询.但是我不确定如何在 lambda/链接语法中做到这一点。

这是一个搜索函数的开始,我想动态地构建 where 字符串,就像我使用 searchOrderBy 字符串来避免大的 SELECT CASE . Products 通过链接表链接到另一个表,一旦我理解了如何执行此示例,我将需要包含该链接表。

如有任何帮助,我们将不胜感激!

谢谢

最佳答案

这是错误的:

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(“Dynamic LINQ”)来处理这类事情,而不是 Query Builder,因为它更易于测试。

关于c# - Linq 实体,多对多和动态 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2236391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com