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。真的吗?