首先我使用的是EF v6.0。我在下面有这个功能;
public List<UserProgressViewModel> GetUserProgresses(int userId)
{
return Context.Database.SqlQuery<UserProgressViewModel>(
"SELECT Puzzles.Name AS PuzzleName, UserProgresses.Minute, " +
"UserProgresses.Session FROM UserProgresses " +
"INNER JOIN Puzzles ON Puzzles.Id = UserProgresses.PuzzleId " +
"WHERE UserProgresses.UserId = @userid", new SqlParameter("@userid", userId)).ToList();
}
我的UserProgressViewModel类位于下方;
public class UserProgressViewModel
{
public string PuzzleName { get; set; }
public int Minute { get; set; }
public int Session { get; set; }
}
(这个类不是DbSet,它只是一个视图模型。)
当我运行应用程序(它是一个WebAPI项目)时,我收到此错误:
&#34;&#39; UserProgress&#39;附近的语法不正确。&#34;
我尝试在Mssql上运行此查询,它工作正常。结果就像我被发现一样。
我搜索了EF 6.0是否支持像这样的原始sql查询,但它确实支持。
(根据此页面:http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/advanced-entity-framework-scenarios-for-an-mvc-web-application#rawsql)
我能看到的是什么东西?
谢谢你,有一个很棒的人!
答案 0 :(得分:1)
实际上你的代码应该可以工作,看起来还不错。 EF支持mssql版本支持的任何原始sql语句。
尝试重构代码并添加db logging:
var sql = @"
SELECT
p.Name AS PuzzleName,
up.Minute,
up.Session
FROM UserProgresses as up
INNER JOIN Puzzles as p ON p.Id = up.PuzzleId
WHERE up.UserId = @userid
";
// Instead of console, you may want to use your default app logging.
ctx.Database.Log += (message) => Console.WriteLine(message);
ctx
.Database
.SqlQuery<UserProgressViewModel>(sql, new SqlParameter("@userid", userid))
.ToList();
现在,您将看到详细的数据库响应。
不是一个解决方案,只是想使用正确的突出显示
答案 1 :(得分:-1)
请注意必须使用属性而不是普通的公共类字段! SqlQuery映射仅适用于类属性,并且不会抛出任何错误,因此很难找到。