То, что у меня сейчас есть, выглядит примерно так:
if(userLikesBananas)
{
return from fruit in basket
select new Fruit
{
AteBanana = Bowl.Any(b => b.OwnedBy == user && b.Contains(fruit) && fruit.Type == FruitType.Banana),
...
...
//lots of properties
...
}
}
else
{
return from fruit in basket
select new Fruit
{
AteBanana = Bowl.Any(b => b.Contains(fruit)),
...
...
//lots of properties
...
}
}
По общему признанию, пример не имеет абсолютно никакого смысла, но принцип в том, что я хочу изменить условия выбора свойств на основе произвольных критериев. Прямо сейчас операторы выбора повторяются.
Теперь пришло время, когда мне нужно добавить критерии, зависящие от другого. Я не хочу иметь 4 разных случая, когда условия собственности немного отличаются.
То, что я хочу сделать, выглядит примерно так:
Func<Fruit, bool> fruitFunc = f => false;
if(userLikesBananas)
{
fruitFunc = f => Bowl.Any(b => b.OwnedBy == user && b.Contains(f) && f.Type == FruitType.Banana);
}
else
{
fruitFunc = f => Bowl.Any(b => b.Contains(f));
}
return from fruit in basket
select new Fruit
{
AteBanana = fruitFunc(fruit)
...
...
//lots of properties
...
};
Проблема в том, что выражение нельзя преобразовать в sql, поскольку оно содержит динамический вызов. Я попытался обернуть Func
в Expression
, но, похоже, возникает та же проблема.
Итак, вопрос в том, как избежать копирования и вставки?