我有以下 Entity Framework 查询:
Func<Company, bool> filter;
if (officeId != 0)
filter = company => !company.IsDeleted && company.OfficeCompanies.Any(c => c.OfficeId == officeId);
else
filter = company => !company.IsDeleted;
var companies = from c in Repository.Query<Company>()
where filter(c) &&
(relationshipTypes.Count() == 0 || relationshipTypes.Any(r => r == c.TypeEnumIndex)) &&
c.Description.Contains(term)
orderby c.Description
select new JqueryUiAutoCompleteItem
{
label = c.Description,
value = SqlFunctions.StringConvert((double)c.Id)
};
它给我错误:
The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.
如果我删除查询主体中对 filter()
的引用,则不会出现错误。
我理解这个错误的意思:我正在使用无法转换成SQL的代码。但是我的 filter()
有什么不能转换成 SQL 的?
最佳答案
您需要将 Func
切换为 Expression
,然后将该表达式直接传递给 LINQ fluent 语法中的 Where
。我认为没有办法在查询语法中使用表达式。
Expression<Func<Company, bool>> filter; //<-- changed type
if (officeId != 0)
filter = company => !company.IsDeleted && company.OfficeCompanies.Any(c => c.OfficeId == officeId);
else
filter = company => !company.IsDeleted;
var companies = from c in Repository.Query<Company>().Where(filter) // <-- changed syntax
where (relationshipTypes.Count() == 0 || relationshipTypes.Any(r => r == c.TypeEnumIndex)) &&
c.Description.Contains(term)
orderby c.Description
select new JqueryUiAutoCompleteItem
{
label = c.Description,
value = SqlFunctions.StringConvert((double)c.Id)
};
关于c# - 在 Entity Framework 查询中使用 Func<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25672506/