-1

我想为这种情况声明空变量,

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

我该如何申报?

4

2 回答 2

3

SingleOrDefault不返回 an IQueryable- 它返回MyTables包含的对象,或 null。因此,如果MyTables包含多个 say 类型的对象MyTable,那就是变量的类型:

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

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

但是,可以轻松地重构此代码以完全摆脱该问题:

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();
于 2013-06-28T11:17:52.987 回答
0

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

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

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

于 2014-09-23T01:01:54.840 回答