lambda SingleOrDefault()的空变量

本文关键字:变量 SingleOrDefault lambda | 更新日期: 2023-09-27 18:20:27

我想为这个条件声明空变量,

 if(........)
 {
  emptyIQueryable= DBContext.MyTables.Join(MyTableTwos , x => x.ID , i => i.TID ,      ((x,i)  => 
  new{
      x,i
     }
  )).Where(x => x.ID == 1).SingleOrDefault();
  }
  else
  {
   emptyIQueryable= DBContext.MyTables.Join(MyTableTwos , x => x.ID , i => i.TID , ((x,i)  => 
  new{
     x,i
     }
  )).Where(x => x.ID == 2).SingleOrDefault();
  }

我该如何申报?

lambda SingleOrDefault()的空变量

SingleOrDefault不返回IQueryable-它返回由MyTables组成的对象,或者为null。因此,如果MyTables包含几个类型为MyTable的对象,那么这就是变量的类型:

MyTable result;
if(........)
{
    result = DBContext.MyTables.SingleOrDefault(x => x.ID == 1);
}
else
{
    result = DBContext.MyTables.SingleOrDefault(x => x.ID == 2);
}

更新编辑后的事情变得更加复杂。您正在使用的表达式返回类型为IEnumerable<anonymous>的对象,这是不可能在代码中显式声明的。但是,对于emptyIQueryable,可以使用objectIEnumerable,但无论哪种方式,都会丢失有关对象的一些信息。

然而,这段代码可以很容易地重构,以完全消除这个问题:

Func<MyTable, bool> condition;
if (.....)
{
    condition = x => x.ID == 1;
}
else
{
    condition = x => x.ID == 2;
}
var emptyIQueryable =
         DBContext.MyTables
                  .Join(MyTableTwos, x => x.ID, i => i.TID, ((x,i) => new {x,i}))
                  .Where(condition).SingleOrDefault();

可以在不赋值的情况下将变量声明为匿名类型。这是编译器的一种技巧,但你可以这样做。

var emptyIQueryable = false 
    ? new { x = default(MyTable), i = default(MyTableTwo) } 
    : null;

emptyIQueryable被赋值为null,并且该匿名对象从未被构造。但它有一些确切的IL类型,正如您稍后创建的那样。编译器保证,在同一方法中创建的任何两个匿名类型化对象,如果具有相同的属性,且具有相同的类型,且顺序相同,则将具有相同类型。因此,您可以稍后在if块中为其指定。