Проблема в том, что CurrentStep - это обычный метод. Следовательно, выражение содержит вызов этого метода, и, естественно, SQL не может выполнять произвольные методы .NET.
Вам нужно будет представить код как выражение. У меня есть один пример глубины здесь: http://www.atrevido.net/blog/2007/09/06/Complicated+Functions+In+LINQ+To+SQL.aspx
К сожалению, компилятор C # 3.0 имеет огромное упущение, и вы не можете генерировать вызовы для выражений. (т.е. вы не можете написать "x => MyExpression (x)"). Чтобы обойти это, нужно либо написать выражение вручную, либо использовать делегат в качестве заполнителя. У Джомо Фишера есть интересный пост о манипулировании деревьями выражений в целом.
На самом деле, не делая этого, я бы, вероятно, подошел к этому, заставив функцию CurrentStep принять предикат, который вы хотите добавить ("Completed == null"). Затем вы можете создать полный Expression> предикат для передачи в Where. Я ленивый, поэтому я собираюсь сделать пример, используя String и Char (String содержит символы, как Item содержит шаги):
using System;
using System.Linq;
using System.Linq.Expressions;
class Program {
static void Main(string[] args) {
Console.WriteLine(StringPredicate(c => Char.IsDigit(c)));
var func = StringPredicate(c => Char.IsDigit(c)).Compile();
Console.WriteLine(func("h2ello"));
Console.WriteLine(func("2ello"));
}
public static Expression<Func<string,bool>> StringPredicate(Expression<Func<char,bool>> pred) {
Expression<Func<string, char>> get = s => s.First();
var p = Expression.Parameter(typeof(string), "s");
return Expression.Lambda<Func<string, bool>>(
Expression.Invoke(pred, Expression.Invoke(get, p)),
p);
}
}
Таким образом, «func» создается с помощью StringPredicate для создания выражения. Для примера мы скомпилируем его для локального выполнения. В вашем случае вы передали бы весь предикат в «Где», чтобы он был переведен в SQL.
Выражение «get» - это место, где вы помещаете свои «расширения» (OrderByWh независимо, First и т. Д.). Затем это передается предикату, который вам дан.
Не волнуйтесь, если это выглядит сложно; это Сорта на первых порах. Если вы раньше не делали такого рода вещи, это займет немного времени (в первый раз, когда я делал такие вещи, потребовались часы, чтобы сделать это правильно: | .. теперь это немного легче). Кроме того, как я уже упоминал, вы можете написать вспомогательный метод, чтобы сделать это переписывание для вас (так что вам не нужно напрямую использовать Expression.Wh независимо от методов), но я не видел примеров и не нужно было еще.