Ваш первый фрагмент кода выполняет всю фильтрацию в .NET, потому что вы используете делегат вместо дерева выражений - даже не пытается преобразовать фильтр в SQL.Другими словами, дело не в том, что первый «работает», а во втором - нет, а в том, что первый не терпит неудачу, потому что на самом деле он не пытается сделать то, что вы ожидаете, тогда как второй делает.
Вторая форма вызывает Queryable.Where(IQueryable<T>, Expression<...>)
, тогда как первая вызывает Enumerable.Where(IEnumerable<T>, Func<...>)
.
Если вы измените свой код на:
Expression<Func<CampaignCodePaths, bool>> filter = e => e.Id.Equals(key);
table().Where(filter).FirstOrDefault();
, тогда все будет хорошо.
РЕДАКТИРОВАТЬ: Отвечая на ваши изменения, я думаю, что вы хотите что-то вроде:
CampaignCodePath Get(Func<IQueryable<CampaignCodePaths>> table,
Expression<Func<CampaignCodePaths, int> selector>,
int key)
{
Expression equal = Expression.Equal(selector, Expression.Constant(key));
var lambda = Expression.Lambda<Expression<Func<CampaignCodePaths, bool>>
(equal, selector.Parameters);
return table().Where(lambda).FirstOrDefault();
}