2010-06-23 4 views
0

Я написал метод, который вызывает метод, возвращающий запрос linq. Внутри этого метода мне нужно применить выражение case к запросу linq, который я получаю от метода, который я вызываю. Я подумал, что, возможно, с выражением лямбда можно было бы применить выражение случая, но как я могу это сделать?Case in Lambda Expression

ответ

1

Ну, вы можете использовать лямбда-выражение оператор тела:

Func<int,string> x = value => 
{ 
    switch(value) 
    { 
     case 0: return "hello"; 
     case 1: return "there"; 
     default: return "other"; 
    } 
}; 

Однако, вы не сможете преобразовать его в дерево выражения, так как они поддерживают только лямбда-выражения с одним выражением. Вы пытаетесь использовать LINQ to SQL здесь?

Конечно, вы могли использовать вложенные условными вместо этого, и это должно работать с деревьев выражений:

Expression<Func<int,string>> x = value => 
    value == 0 ? "hello" 
    : value == 1 ? "there" 
    : "other"; 

Это рода коммутатора/случае ... хотя не очень эффективен, он может будьте достаточно хороши для вас.

+0

Да, я пытаюсь использовать LINQ для SQL здесь. И одним из требований является скорость. Приложение, над которым я работаю, довольно быстро выполняет почти все свои задачи, и я не могу отказаться от качества, если вы знаете, что я имею в виду. – Hallaghan

+1

@Hallaghan: Ну, это не эффективно в * C# *, но это может привести к соответствующему SQL без каких-либо проблем. Я найду что-то, что работает в первую очередь, и * затем * беспокоиться об эффективности. –

-1

Возможно, вы сможете использовать тернарное заявление.

[boolean expression] ? [result if true] : [result if false] 
+0

Я попытался сделать это таким образом, но получил только исключение. var c = q.Where (e => e.Status.Value == 6? E.Status.Value = 0: e.Status.Value); – Hallaghan

+1

@ Hallaghan: «Только получил исключение» не очень подробно. Пожалуйста, предоставьте как можно больше информации в вопросе. Если вы что-то пробовали, но получили исключение, расскажите нам об этом. Точно так же это помогло бы, если бы вы сказали, что используете LINQ to SQL для начала. –

+0

Прошу прощения, у меня плохой день, и я отвлекаюсь. По теме, я получаю исключение System.InvalidOperation при попытке конвертировать из типа bool в int. Интересно, происходит ли это, потому что e.Status является нулевым. – Hallaghan

1

Можете ли вы использовать обычную старую функцию для выполнения этого вместо лямбда?

X.Select(GetY); 

or 

X.Select(x => GetY(x)); 

or 

from x in X 
select new 
{ 
    y = GetY(x) 
}; 

...

private YType GetY(XType x) 
{ 
    switch(x) 
    { 
     ... 
    } 
}