c# – linq对实体无法识别方法

c# – linq对实体无法识别方法,第1张

概述我有这些方法: public int count( Guid companyId, Expression<Func<T, bool>> isMatch) { var filters = new Expression<Func<T, bool>>[]{ x => x.PriceDefinition.CompanyId == compan 我有这些方法:
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.

这是什么原因?
我该如何解决?

解决方法 当使用linq-to-entitIEs时,您不能在查询中使用任意.NET方法.查询中使用的每个方法必须可以翻译为sql.它不会帮助您返回Expession< Func< entityType,bool>>>因为必须为数据库服务器上的每个记录评估条件.

对于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函数.

总结

以上是内存溢出为你收集整理的c# – linq对实体无法识别方法全部内容,希望文章能够帮你解决c# – linq对实体无法识别方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1259575.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存