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();
}
我该如何申报?
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
,可以使用object
或IEnumerable
,但无论哪种方式,都会丢失有关对象的一些信息。
然而,这段代码可以很容易地重构,以完全消除这个问题:
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块中为其指定。