lambda SingleOrDefault()的空变量

时间:2013-06-28 11:14:22

标签: c# lambda variable-assignment

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

 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();
  }

我该如何宣布?

2 个答案:

答案 0 :(得分:3)

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>的对象,这在代码中是不可能明确说明的。但是,您可以对object使用IEnumerableemptyIQueryable,但无论如何,您都会丢失有关该对象的一些信息。

但是,可以轻松地重构此代码以完全解决问题:

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();

答案 1 :(得分:0)

可以将变量声明为匿名类型而不分配给它。这是编译器的一种技巧,但你可以这样做。

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

emptyIQueryable被赋值为null,并且永远不会构造该匿名对象。但是它稍后会创建一些IL类型。编译器保证在同一方法中创建的任何两个匿名类型对象具有相同类型的相同属性具有相同的类型。因此,您可以稍后在if块中为其分配。