c# – 在LINQ表达式中使用方法的解决方法
在我的ASP.NET MVC3应用程序中,我有以下使用EF实体的方法:
public IQueryable<Products> GetCreatedProducts(int year) { return GetAllProducts().Where(m => Equals(DateUtilities.ExtractYear(m.ProductCreationDate),year)); } ProductCreationDate是以字符串“YYYYMMddhhmm”存储在数据库中的字段. int DateUtilities.ExtractYear(字符串日期)是我创建的一个方法,用于从字符串中获取年份.同样,我使用ExtractMonth和ExtractDay. 但是,当我执行我的应用程序时,它会启动一个NotSupported异常: “LINQ to Entities无法识别方法’Int32 ExtractYear(System.String)’方法,并且此方法无法转换为商店表达式.” 通过谷歌搜索问题,我发现它是LINQ to Entities中的一个错误任何人都知道一个解决方法? 解决方法
你得到了例外,因为你使用了IQueryable.实体框架将尝试将where子句中的谓词转换为SQL,但EF不知道如何转换您的方法.
如果您不想(或不能)更改数据库,您仍有几个选项: >将所有行拉到客户端并在客户端上进行过滤.您可以通过从IQueryable更改为IEnumerable来执行此操作: return GetAllProducts() .AsEnumerable() .Where(m => Equals(DateUtilities.ExtractYear(m.ProductCreationDate),year)) .AsQueryable(); >为了提高效率,您可以使用自己的SQL(这需要EF 4.1,只能避免将所有产品都拉到客户端,而不是服务器上的扫描): return context .Products .SqlQuery("select * from Products where substring(ProductCreationDate,1,4) = '2012'") .AsQueryable(); 请注意,我懒惰并硬编码SQL.您可能应该对其进行参数化,并确保避免任何SQL注入攻击. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |