2013-06-28 4 views
-1

Я хочу объявить пустой переменной для этого условия,Empty Переменная для лямбда SingleOrDefault()

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

Как я могу объявить его?

+0

Непонятно, чего вы пытаетесь достичь. Попробуйте переформулировать свой вопрос. –

+0

'MyTable emptyIQueryable;' должен компилироваться (с плохим наименованием), результат 'SingleOrDefault' не является' IQueryable' любого типа. –

+0

@zey Что значит «этого не может быть»? –

ответ

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

Update. После редактирования вещи усложняются. Выражение, которое вы используете, возвращает объект типа IEnumerable<anonymous>, который невозможно явно указать в коде. Однако вы можете использовать либо object, либо IEnumerable для 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(); 
+0

+1 и спасибо Андрей, я отредактировал свой вопрос. Как я могу это сделать, если я присоединился к двум таблицам? – zey

+0

@zey, смотрите обновления. – Andrei

+0

@Andrei: На самом деле невозможно объявить переменную как анонимный. См. Мой ответ. Я не рекомендую использовать эту технику, но это возможно. – recursive

0

Можно объявить переменную как анонимный тип, не назначая ему. Это своего рода трюк компилятора, но вы можете сделать это так.

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

emptyIQueryable присваивается пустое значение, и что анонимный объект никогда не строится. Но он имеет точный IL-тип, который вы создаете позже. Компилятор гарантирует, что любые два анонимно типизированных объекта, созданные в том же методе, которые имеют одинаковые свойства с одинаковыми типами в одном порядке, будут иметь один и тот же тип. Поэтому вы можете назначить его в своем блоке if позже.

Смежные вопросы