Entity Framework 6.0 Raw Sql 查看模型

Posted

技术标签:

【中文标题】Entity Framework 6.0 Raw Sql 查看模型【英文标题】:Entity Framework 6.0 Raw Sql to View Model 【发布时间】:2016-04-20 09:06:58 【问题描述】:

首先我使用的是 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 项目)时,我收到此错误: “'UserProgresses' 附近的语法不正确。” 我尝试在 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)

这个我看不见的东西是什么? 谢谢,祝你好运!

【问题讨论】:

Incorrect syntax near 'UserProgresses' 由 SQL Server 生成,请确保查询在语法上有效。这不太可能引起问题,但我至少会将Puzzles.Name 写为Puzzles.[Name]UserProgresses.Minute 写为UserProgresses.[Minute]Session 同上)。 technet.microsoft.com/en-us/library/ms189822(v=sql.110).aspx 投票结束,因为这是 Visual Studio 的一个暂时性问题,正如 OP 在@tenbits 提供的答案的 cmets 中提到的那样。 【参考方案1】:

实际上,您的代码应该可以工作,而且看起来还可以。 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();

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

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

【讨论】:

感谢您的回复,记录是个好主意。正如您所说,我的代码应该可以工作,并且实际上可以工作。问题的原因是视觉工作室本身。不知何故,它无法识别那段代码。然后它开始向我显示“源文件不同”错误。经过一番研究,我发现这对我有帮助:***.com/questions/3087390/…【参考方案2】:

注意您必须使用属性而不是普通的公共类字段! SqlQuery 映射仅适用于类属性并且不会引发错误,因此很难找到。

【讨论】:

为什么要投反对票?这让我很难找到这个无证的东西。

以上是关于Entity Framework 6.0 Raw Sql 查看模型的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core 6.0 预览4 性能改进

Entity Framework 6.0 - 删除时的奇怪行为

Entity Framework Core 6.0 中的新功能介绍

Entity Framework Core 6.0 中的新功能介绍

Entity Framework Core 6.0 中的新功能介绍

Entity Framework Core 6.0 中的新功能介绍