gpt4 book ai didi

带有包含多个条件的 WHERE 子句的 LINQ 查询

转载 作者:行者123 更新时间:2023-12-03 07:37:48 24 4
gpt4 key购买 nike

我将 EntityFramework 与 POCO 结合使用。
假设我的 POCO 定义如下(简化):

class Class1
{
public int ID;
public int SomeNumber;
}

class Class2
{
public int ID;
public int SomeNumber;
}

class Class3
{
public int ID;
public int SomeNumber;
}

class SomeClass
{
public int ID;
public int? Class1ID;
public Class1 Class1;
public int? Class2ID;
public Class2 Class2;
public int? Class3ID;
public Class3 Class3;
}

我想从数据库中获取属于 Class1Class2Class3 之一的所有 SomeClass 记录 其中 ClassX.SomeNumber 等于某个数字。

我编写了如下所示的 LINQ 查询:

Database DB = new Database(); // object context
var result = DB.SomeClass.ToList();

int SomeNumber = 1; // some number
List<SomeClass> retValue = result
.Where(x =>
{
int Number = 0;
if (x.Class1 != null)
Number = x.Class1.SomeNumber;
else if (x.Class2 != null)
Number = x.Class2.SomeNumber;
else if (x.Class3 != null)
Number = x.Class3.SomeNumber;
return Number == SomeNumber;
})
.ToList();

...但是retValue不包含任何记录。

解决方案

显然我必须指定 .Include 语句,因为延迟加载被禁用,并且 x.Class1x.Class2x .Class3 始终具有 null 值。我感到羞愧,因为我没有明确声明禁用延迟加载 - 那么问题就很明显了。

但是,感谢 Ladislav 的帖子,我改进了我的代码,如下所示:

Database DB = new Database(); // object context

int SomeNumber = 1; // some number
List<SomeClass> retValue = DB.SomeClass
.Include("Class1")
.Include("Class2")
.Include("Class3")
.Where(x =>
SomeNumber == x.Class1.SomeNumber ||
SomeNumber == x.Class2.SomeNumber ||
SomeNumber == x.Class3.SomeNumber)
.ToList();

我不知道 LINQ-to-Entities 应该执行自动空合并。

最佳答案

恕我直言,您应该对此感到满意:

Database DB = new Database(); 
var result = DB.SomeClass.Where(x =>
Number == x.Class1.SomeNumber ||
Number == x.Class2.SomeNumber ||
Number == x.Class3.SomeNumber)
.ToList();

您的查询加载所有数据,然后您在 .NET 中评估条件 = 您必须在访问 SomeNumber 之前测试 null 值,但如果您评估 SomeNumber 则不需要这样做通过 Linq-to-entities 在 SQL 中。 Linq-to-entities 应执行自动空合并。

关于带有包含多个条件的 WHERE 子句的 LINQ 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10333732/

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