LINQ to Entities 无法识别方法 'Int32 Int32(System.String)' 方法,并且此方法无法转换为存储表达式

Posted

技术标签:

【中文标题】LINQ to Entities 无法识别方法 \'Int32 Int32(System.String)\' 方法,并且此方法无法转换为存储表达式【英文标题】:LINQ to Entities does not recognize the method 'Int32 Int32(System.String)' method, and this method cannot be translated into a store expressionLINQ to Entities 无法识别方法 'Int32 Int32(System.String)' 方法,并且此方法无法转换为存储表达式 【发布时间】:2012-12-02 23:06:57 【问题描述】:

我正在尝试使用 Linq to Entities 查询数据库上下文,但出现此错误:

LINQ to Entities 无法识别方法“Int32 Int32(System.String)”方法,并且该方法无法转换为存储表达式。`

代码:

public IEnumerable<CourseNames> GetCourseName()

   var course = from o in entities.UniversityCourses
                select new CourseNames
                
                    CourseID = Convert.ToInt32(o.CourseID),
                    CourseName = o.CourseName,
                 ;
   return course.ToList();

看到this之后就这样尝试

public IEnumerable<CourseNames> GetCourseName()

    var temp = Convert.ToInt32(o.CourseID);
    var course = from o in entities.UniversityCourses
                 select new CourseNames
                 
                     CourseID = temp,
                     CourseName = o.CourseName,
                 ;
    return course.ToList();

但是它会抛出一个错误:

“当前上下文中不存在名称‘o’”

这是我的课程代码GetCourseName

namespace IronwoodWeb

    public class CourseNames
    
        public int CourseID  get; set; 
        public string CourseName  get; set; 
    

【问题讨论】:

试试int.Parse(o.CourseID);错误是因为EF不知道如何用SQL编写Convert.ToInt32,但我认为它应该理解int.Parse ..(最好是使用适当的列类型并避免必须处理这种转换:) @pst using int.parse 抛出相同的错误“当前上下文中不存在名称'o'”并且我不能使用相同的列类型,它也显示错误“不能隐式转换类型.....”无论如何,感谢您尝试帮助我! 解决此问题的另一种方法(EF 无法将某些表达式转换为 SQL)是首先运行一个更简单的查询,然后在最后强制它通过 .ToList() 填充。一旦将其放入内存中,您就不必再将表达式转换为 SQL。 @user1905332 不,这是一个不同的问题(o 超出范围)。返回 first 查询,但是将Convert.ToInt32 替换为int.Parse,嗯nevermind,这是另一种方式。似乎是 IEnumerable 与 IQueryable 的区别? @pst 不用担心,lazyberezovsky 发布的答案有效,无论如何感谢您尝试帮助我! 【参考方案1】:
public IEnumerable<CourseNames> GetCourseName()

    var courses = from o in entities.UniversityCourses
                  select new  o.CourseID, o.CourseName ;

    return courses.ToList() // now we have in-memory query
                  .Select(c => new CourseNames()
                  
                     CourseID = Convert.ToInt32(c.CourseID), // OK
                     CourseName = c.CourseName
                  );

【讨论】:

有没有办法让 str->int 转换 不需要强制在内存中? @lazyberezovsky 非常感谢!它奏效了,我试图解决这个问题超过两个小时!再次感谢! :) @pst 据我所知,只有在服务器端无法进行这种转换 有,通过使用显式转换(见下面的答案) 需要注意的是最好使用AsEnumerable来代替,以避免在内存中创建一个不需要的列表。【参考方案2】:

您还可以将值作为字符串返回(因为它显然是存储的),然后在之后转换它。

'o' 脱离上下文的错误是你只在 Linq 查询中声明 o,它只能在那个范围内被引用。

【讨论】:

答案lazyberezovsky 发布的作品,无论如何感谢您尝试帮助我!【参考方案3】:

如果您不想具体化查询(检索数据),您可以使用强制转换(即 (int) o.CourseId)。转换为 SQL CAST AS 语句。

【讨论】:

【参考方案4】:

显式转换简单且有效:(int)o.CourseID

var course = from o in entities.UniversityCourses
                select new CourseNames
                
                    CourseID = (int)o.CourseID,
                    CourseName = o.CourseName,
                 ;

【讨论】:

这甚至无法编译:CS0030: 无法将类型 'string' 转换为 'int' 先转换为object,然后是int,然后编译。但是,Linq to Entities 仍然不会识别它。但是,Linq to SQL 会。

以上是关于LINQ to Entities 无法识别方法 'Int32 Int32(System.String)' 方法,并且此方法无法转换为存储表达式的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to Entities 无法识别方法 IsNullOrWhiteSpace

错误:LINQ to Entities 无法识别方法 DataLength

LINQ To Entities 无法识别方法 Last。真的吗?

LINQ To Entities 无法识别方法 Last。真的吗?

C# LINQ to Entities 无法识别方法“布尔”

我如何修复“LINQ to Entities无法识别方法”错误