Решение 1
Это решение не удаляет операторы invoke, которые, как я полагаю, вы пытаетесь сделать, вызывая "Expand".
измените результат "forTargetId (String id)) "to
predicate.And(m => fc.Invoke(m) == id);
Когда выражение скомпилировано в предложении where, оно будет знать, что ему нужно передать" m "в выражение fc выше.
Мой первый совет пришел, когда я изменил
predicate.And(m => fc.Invoke(m) == id).Expand();
на
predicate.And(n => fc.Invoke(n) == id).Expand();
, и я увидел, что n вообще не передается.
Я протестировал это изменение, манипулируя методом Main следующим образом
static void Main(string[] args)
{
var barModel = new BarModel();
barModel.list.Add(new Model() { key = "1", value = "One" });
barModel.list.Add(new Model() { key = "2", value = "Two" });
barModel.list.Add(new Model() { key = "some", value = "Three" });
string id = "some";
Console.WriteLine(barModel.subFor(id).ToString());
// output: m => (True AndAlso (m.key == value(ConsoleApplication2.Bar`1+<>c__DisplayClass0[ConsoleApplication2.Model]).id))
Console.ReadKey();
var subworkitems = barModel.list.Where(barModel.subFor(id).Compile());
// Exception {"variable 'm' of type 'ConsoleApplication2.Model' referenced from scope '', but it is not defined"}
foreach (var si in subworkitems)
{
Console.WriteLine(si.key);
Console.WriteLine(si.value);
}
Console.WriteLine(subworkitems.ToString());
Console.ReadKey();
}
Решение 2
Это решение удаляет операторы Invoke с использованием метода Expand, но изменяет способ, которымвы объединяете операторы вместе.
Функция «Развернуть» объявляется на веб-сайте LinqKit следующим образом.
Expression<Func<Purchase, bool>> criteria1 = p => p.Price > 1000;
Expression<Func<Purchase, bool>> criteria2 = p => criteria1.Invoke(p) || p.Description.Contains("a");
Console.WriteLine(criteria2.Expand().ToString());
// p => ((p.Price > 1000) || p.Description.Contains("a"))
Обратите внимание, что они не используют метод «И» дляэти вещи вместе, но вместо этого они «объединяют в цепочку» вызовы вместе.
Вместо
Expression<Func<TModel, bool>> predicate = m => true;
var result = predicate.And(m => fc.Invoke(m) == id).Expand();
Сделайте это
Expression<Func<TModel, bool>> predicate = m => fc.Invoke(m) == id && true;
return predicate.Expand();