2016-04-20 5 views
3

最初に私はEF v6.0を使用しています。私はこの機能を以下に持っています。Entity Framework 6.0モデルを表示するRaw SQL

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

私には見えないものは何ですか?
ありがとう、素晴らしいものがあります!

+0

''UserProgresses'の近くに不正な構文がSQL Serverによって生成された場合、そのクエリが構文的に有効であることを確認してください。問題は起こりにくいですが、Puzzles。NameとしてPuzzles。[Name] 'と' UserProgresses.Minute'を最低でも 'UserProgresses。[Minute]'( 'Session'には同上)と書いています。 https://technet.microsoft.com/en-us/library/ms189822(v=sql.110).aspx –

+0

これはVisual Studioの一時的な問題であるため、OPのコメントに答えとして投票が終了しています@tenbitsが提供されました。 –

答えて

1

実際にはあなたのコードは正常に動作するはずです。 EFは、あなたのmssqlバージョンがサポートしている生のSQL文をサポートしています。

はあなたのコードをリファクタリングし、DBのログを追加してください:

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

さて、あなたは詳細なデシベル回答が表示されます。

はちょうど適切な

+0

あなたの応答をありがとう、それはログに記録することをお勧めしました。あなたが言ったように、私のコードはうまくいくはずで、実際に動作します。問題の原因はビジュアルスタジオそのものでした。何とかそのコードを認識しませんでした。その後、私は "ソースファイルが異なる"エラーを表示し始めた。少しの研究の後、私はこれが私を助けてくれました:http://stackoverflow.com/questions/3087390/the-source-file-is-different-from-when-the-module-was-built –

-1

があなたの代わりに、通常のパブリッククラスフィールドのプロパティを使用する必要が用心強調し使用していた、非常に解決策ではありません! SqlQueryマッピングはクラスプロパティでのみ機能し、エラーをスローしないため、見つけにくいです。

+0

なぜdownvote?この文書化されていないことを見つけ出すのは苦労しました。 – lukyer

関連する問題