public int count( Guid companyId,Expression<Func<T,bool>> isMatch) { var filters = new Expression<Func<T,bool>>[]{ x => x.PriceDefinition.CompanyId == companyId,isMatch }; return GetCount(filters); } public virtual int GetCount( IEnumerable<Expression<Func<T,bool>>> filters) { IQueryable<T> _query = ObjectSet; if (filters != null) { foreach (var filter in filters) { _query = _query.Where(filter); } } return _query.Count(); }
使用时:
count(some_guid,x => x.IsMatch(entityId,inviterId,routeId,luggageTypeId));
我得到以下例外:
LINQ to Entities does not recognize the method 'Boolean IsMatch(System.Nullable`1[System.Int64],System.Nullable`1[System.Int64],System.Nullable`1[System.Int64])' method,and this method cannot be translated into a store expression.
这是什么原因?
我该如何解决?
解决方法
对于EF,您的代码意味着如下:
SELECT COUNT(*) FROM ... LEFT JOIN ... WHERE IsMatch(....)
因为EF验证传递给查询的函数名称,它会抛出异常,因为它不了解sql Server上的IsMatch等效项.
在Linq-to-entities中可以使用的唯一可能的功能是:
> Cannonical functions,具有预定义映射到sql等价物
> EdmFunctions
EdmFunctions是用EdmFunctionAttribute标记的方法,它将.NET函数映射到sql对应物.那些函数通常不能在普通的.NET代码中执行,因为它们什么都不做,也不会抛出异常.他们只是Linq对实体的功能占位符.可用的EdmFunction是:
> System.Data.Objects.EntityFunctions中的预定义EdmFunctions
> System.Data.Objects.sqlClient.sqlFunctions中的sql Server的预定义EdmFunctions(非紧凑型)
>自定义映射sql函数 – Entity设计器中的导入向导允许您导入sql函数(表值函数除外).之后可以编写自定义静态.NET函数,并将其通过EdmFunction属性映射到导入设计器的sql函数.
>自定义模型定义的函数 – 这是在EDMX文件中手动编写的特殊功能(以XML格式打开).它是Entity sql的自定义可重用部分.
我已经在另一个答案中描述了how to create model defined function.创建映射SQL function is pretty similar.而不是在EDMX中手动创建Function元素,您将将EdmFunctionAttribute属性映射到导入的sql函数.