2015-03-12 2 views
-2

Я пытаюсь создать анонимную функцию для функции linq Any. Я не понимаю, почему вы не можете это сделать:Почему нельзя преобразовать в дерево выражений?

found = db.Label.Any(lb => { 
    var shortNames = lb.lbShortName.Split('/').ToList(); 

    bool foundShortName = false; 
    foreach (var shortName in shortNames) 
    { 
     if (String.Compare(shortName, name, StringComparison.OrdinalIgnoreCase) == 0) 
     { 
      foundShortName = true; 
      break; 
     } 
    } 
    return foundShortName; 

Или лучше, что я не понимаю, почему это Expression(Func(,)) и не Func(,) });

+0

Это довольно сложная функция! linq действительно хорошо подходит для простых вещей. возможно, вы можете разбить это на отдельные шаги с помощью прогнозов. –

+1

EF нуждается в выражениях, чтобы преобразовать Linq-код в SQL. – juharr

+3

Кроме того, если я правильно прочитал ваш код, вы могли бы просто сделать один вызов «Содержит». –

ответ

1

Вы должны использовать Linq-провайдер, такой как LINQ-to-SQL или Entity Framework. Он пытается преобразовать выражение в нечто вроде SQL-запроса, и это недостаточно просто для этого. Это будет работать нормально, если db.Label был равным IEnumerable<> вместо IQueryable<>.

+0

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

+0

Нет. Механизм запросов проверяет выражение _code_ (вы фактически не передаете 'Func ', а 'Expression >'), и он не будет знать, что на самом деле делает функция. Вы застряли в использовании выражения, которое может быть переведено на SQL, или если вы хотите, чтобы .NET запускал код, сначала запустите запрос ('.ToList()'), а затем выполните изменения, хотя это не работает для ваших нужд в этом случае. – Jacob