在Entity Framework查询中使用Func<>

4

我有以下的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)
                };

它给我返回了错误:

LINQ表达式节点类型“Invoke”在LINQ to Entities中不受支持。

如果我在查询的主体中删除对filter()的引用,就不会出现错误。

我理解这个错误的意思:我正在使用无法转换为SQL的代码。但是我的filter()有什么不能转换为SQL的地方呢?


2
你必须按照表达式的形式创建它。 https://dev59.com/sWMl5IYBdhLWcg3wgnSl - TyCobb
@TyCobb:我尝试过了,但是我该如何从我的查询中调用筛选表达式呢?我不能像上面那样调用它。你链接的页面使用了.Where()方法而不是LINQ查询。 - Jonathan Wood
1个回答

8
你需要将Func改成Expression,然后在LINQ的流畅语法中直接将该表达式传递给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)
                };

是的,将.Where()附加到LINQ查询上看起来有点奇怪,但它似乎可以工作。 - Jonathan Wood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接