LINQ to Entities不认识方法'Int32 Int32(System.String)',并且这个方法不能被转换成存储表达式。

17
我正试图使用 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();
}

在看了这篇文章之后,我尝试过以下方法:

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; }
    }
}

2
尝试使用 int.Parse(o.CourseID); 出现错误是因为 EF 不知道如何将 Convert.ToInt32 转换成 SQL,但我认为它应该理解 int.Parse ..(最好使用适当的列类型,避免处理此转换 :)) - user166390
@pst 使用 int.parse 会抛出相同的错误 "The name 'o' does not exist in the current context",我也不能使用相同的列类型,它还显示错误 "Cannot implicitly convert type....."。无论如何,感谢您尝试帮助我! - user1905332
2
绕过EF无法将某些表达式转换为SQL的问题的另一种方法是先运行一个更简单的查询,最后通过.ToList()强制填充它。一旦在内存中,您就不再受到必须将表达式转换为SQL的限制。 - Heather
@user1905332 不,那是一个不同的问题('o'超出了范围)。回到第一个查询,但将Convert.ToInt32替换为int.Parse,嗯[算了](http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/6c8892db-8df7-4174-b9b0-764dc1df82ad),看起来是IEnumerable vs. IQueryable的区别? - user166390
@pst 不用担心,lazyberezovsky发布的答案有效,无论如何感谢你尝试帮助我! - user1905332
@Heather解决了这个问题,无论如何谢谢你尝试帮助我! - user1905332
4个回答

39
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
                  });
}

11
有没有一种方法可以进行str->int转换,而不需要强制内存? - user166390
@lazyberezovsky 非常感谢!它起作用了,我试图弄清楚这个问题已经超过两个小时了!再次感谢! :) - user1905332
据我所知,目前没有内置的服务器端进行该转换的可能性。@pst - Sergey Berezovskiy
通过使用显式转换(请参见下面的答案),可以实现这一点。 - Jonathan M
应该注意到最好使用AsEnumerable,以避免在内存中创建不必要的列表。 - juharr

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

3

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

“o”超出上下文的错误是因为你只在Linq查询中声明了“o”,它只能在该作用域中被引用。


lazyberezovsky发布的答案有效,无论如何感谢你们尝试帮助我! - user1905332

-3

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

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

那甚至无法编译:CS0030:无法将类型“string”转换为“int” - poizan42
先转换为 object,然后转换为 int,就可以编译了。但是 Linq to Entities 仍然无法识别它。不过 Linq to SQL 可以。 - General Grievance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接