实体框架6.0原始Sql到视图模型

本文关键字:视图 模型 Sql 原始 框架 实体 | 更新日期: 2024-10-21 16:22:26

首先我使用的是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项目)时,我会收到以下错误:
"'UserProgresss'附近的语法不正确。"

我试着在Mssql上运行这个查询,它运行得很好。结果正如我所预料的那样

我搜索了EF6.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)

我看不见的东西是什么
谢谢你,祝你过得愉快!

实体框架6.0原始Sql到视图模型

实际上,您的代码应该可以工作,而且看起来还可以。EF支持mssql版本支持的任何原始sql语句。

尝试重构代码并添加数据库日志:

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();

现在,您将看到详细的数据库响应。

不是一个完全的解决方案,只是想使用适当的突出显示

小心必须使用属性而不是普通的公共类字段SqlQuery映射仅适用于类属性,并且不会抛出任何错误,因此很难找到它。