加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在LINQ表达式中使用方法的解决方法

发布时间:2020-12-16 00:02:56 所属栏目:百科 来源:网络整理
导读:在我的ASP.NET MVC3应用程序中,我有以下使用EF实体的方法: public IQueryableProducts GetCreatedProducts(int year){ return GetAllProducts().Where(m = Equals(DateUtilities.ExtractYear(m.ProductCreationDate),year));} ProductCreationDate是以字符
在我的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注入攻击.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读