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
具有多个条件的WHERE子句的LINQ查询_Linq_Entity Framework - Fatal编程技术网

具有多个条件的WHERE子句的LINQ查询

具有多个条件的WHERE子句的LINQ查询,linq,entity-framework,Linq,Entity Framework,我将EntityFramework与POCO一起使用。 假设我对POCO的定义如下(简化): 我想从数据库中获取所有SomeClass记录,这些记录属于Class1、Class2或Class3,其中ClassX.SomeNumber等于某个数字 我编写了LINQ查询,如下所示: Database DB = new Database(); // object context var result = DB.SomeClass.ToList(); int SomeNumber = 1; // so

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

我想从数据库中获取所有
SomeClass
记录,这些记录属于
Class1
Class2
Class3
,其中
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();
int SomeNumber = 1; // some number 
List<SomeClass> retValue = result 
    .Where(x => 
        { 
            if (x.Class1 != null && x.Class1.SomeNumber == SomeNumber) 
                return true;
            else if (x.Class2 != null && x.Class2.SomeNumber == SomeNumber) 
                return true;
            else if (x.Class3 != null && x.Class3.SomeNumber == SomeNumber) 
                return true;
            return false;
        }) 
    .ToList();

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

我想您应该怎么做:

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
之前必须测试空值,但如果您通过Linq to实体在SQL中计算
SomeNumber
,则不需要测试空值。Linq to实体应该执行自动空合并。

根据您的逻辑,如果x.Class1不是空的,但是x.Class1.SomeNumber是3,它不会检查所有其他子句

如果您想检查,如果只是some
ClassN.SomeNumber==SomeNumber
,那么您应该这样做:

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();
int SomeNumber = 1; // some number 
List<SomeClass> retValue = result 
    .Where(x => 
        { 
            if (x.Class1 != null && x.Class1.SomeNumber == SomeNumber) 
                return true;
            else if (x.Class2 != null && x.Class2.SomeNumber == SomeNumber) 
                return true;
            else if (x.Class3 != null && x.Class3.SomeNumber == SomeNumber) 
                return true;
            return false;
        }) 
    .ToList();
int SomeNumber=1;//一些数字
列表值=结果
.其中(x=>
{ 
if(x.Class1!=null&&x.Class1.SomeNumber==SomeNumber)
返回true;
else if(x.Class2!=null&&x.Class2.SomeNumber==SomeNumber)
返回true;
else if(x.Class3!=null&&x.Class3.SomeNumber==SomeNumber)
返回true;
返回false;
}) 
.ToList();

除了我的代码还有一行之外,这个代码不是和我使用的代码一样吗?不是,因为如果数字相等,它会立即返回。在您的代码中,可能有一个正确的数字,但它会被另一个if子句覆盖。它无法被覆盖,因为存在
else
子句,并且如果所有条件都不匹配,它将返回0。实际上,解决方案是(我通常在询问后不久自己发现)由于延迟加载被禁用,在运行
Where
子句之前,我必须执行
var result=DB.SomeClass.Include(“Class1”).Include(“Class2”).Include(“Class3”)
。但是,我将此标记为已接受,因为您教会了我如何改进代码(在LINQ中直接使用
Where