C# 使用Func<&燃气轮机;实体框架内查询
我有以下实体框架查询:C# 使用Func<&燃气轮机;实体框架内查询,c#,linq,entity-framework,C#,Linq,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
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)
};
Func过滤器;
如果(officeId!=0)
过滤器=公司=>!company.IsDeleted和company.OfficeCompanies.Any(c=>c.OfficeId==OfficeId);
其他的
过滤器=公司=>!公司被删除;
var companys=来自Repository.Query()中的c
其中过滤器(c)&&
(relationshipTypes.Count()==0 | | relationshipTypes.Any(r=>r==c.TypeEnumIndex))&&
c、 说明.包含(术语)
orderby c.说明
选择新的JqueryUiAutoCompleteItem
{
标签=c.说明,
value=SqlFunctions.StringConvert((双精度)c.Id)
};
它给了我一个错误:
LINQ to实体中不支持LINQ表达式节点类型“Invoke”
如果删除查询主体中对filter()
的引用,则不会出现错误
我理解此错误的含义:我使用的代码无法转换为SQL。但是我的
filter()
有什么不能转换为SQL的呢?您需要将Func
切换到表达式,然后用LINQ fluent语法将该表达式直接传递到中的。我认为没有办法在查询语法中使用表达式
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)
};
表达式过滤器;//!company.IsDeleted和company.OfficeCompanies.Any(c=>c.OfficeId==OfficeId);
其他的
过滤器=公司=>!公司被删除;
var companys=from c in Repository.Query().Where(filter)//r==c.TypeEnumIndex))&&
c、 说明.包含(术语)
orderby c.说明
选择新的JqueryUiAutoCompleteItem
{
标签=c.说明,
value=SqlFunctions.StringConvert((双精度)c.Id)
};
您必须按照表达式中的方式创建它@TyCobb:我试过了,但是如何从查询中调用过滤器表达式呢。我不能像上面那样称呼它。您链接到的页面使用.Where()
方法而不是LINQ查询。是的,在.Where()
上标记LINQ查询看起来有点奇怪,但它似乎可以工作。