实体框架6.0 Raw Sql查看模型

时间:2016-04-20 09:06:58

标签: c# sql-server entity-framework entity-framework-6

首先我使用的是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

我能看到的是什么东西?
谢谢你,有一个很棒的人!

2 个答案:

答案 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映射仅适用于类属性,并且不会抛出任何错误,因此很难找到。