В этом нет волшебства: деревья выражений переводятся в запросы SQL, что понимают реляционные базы данных. Вы можете сделать почти все в дереве выражений. К сожалению, не все операции реализованы. Рассмотрим следующий пример:
Presentation press = context
.Presentations
.Where(m => SomeCustomFunctionThatUsesUnmanagedPInvokeCode(m.PresId))
.FirstOrDefault();
Что вы ожидаете от сгенерированного SQL-запроса?
Так обстоит дело с индексаторами массивов. Они не могут быть переведены в запросы SQL.
Как говорится, в вашем случае следующее может быть немного проще:
public List<string> GetpathsById(List<long> id)
{
return
(from p in context.Presentations
where id.Contains(p.PresId)
select p.FilePath
).ToList();
}
Метод .Contains
будет переведен в предложение SQL IN
. Это позволяет избежать отправки нескольких запросов SQL в базу данных, как это делается в вашем примере на каждой итерации.