2016-11-29 6 views
2

私はこのようになりますEntity Frameworkのクエリを持っています。 votesのプロパティを見ると、それは単にCharacterIDに基づく投票を除外しているだけです。これは私の期待通りに機能します。Entity Frameworkのカウント子エンティティは

しかし、これをさらに進めて、実際に各キャラクタの投票数を取得したいと思います。私はこのような何かに私のクエリを変更するのであれば、このエラーの関心の

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] 
     Request starting HTTP/1.1 GET http://localhost:5000/api/videos/1/matchup application/json 
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 
     Executing action method Mindgame.Controllers.VideosController.GetMatchupByVideoId (mindgame-api) with arguments (1) - ModelState is Valid 
info: Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor[1] 
     Executing ObjectResult, writing value Microsoft.AspNetCore.Mvc.ControllerContext. 
fail: Microsoft.AspNetCore.Server.Kestrel[13] 
     Connection id "0HL0OILHK80GT": An unhandled exception was thrown by the application. 
Microsoft.Data.Sqlite.SqliteException: SQLite Error 1: 'no such column: v.Matchup.MatchupID'. 
    at Microsoft.Data.Sqlite.Interop.MarshalEx.ThrowExceptionForRC(Int32 rc, Sqlite3Handle db) 
    at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior behavior) 
    at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, String executeMethod, IReadOnlyDictionary`2 parameterValues, Boolean closeConnection) 
    at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues) 
    at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable.Enumerator.BufferlessMoveNext(Boolean buffer) 
    at Microsoft.EntityFrameworkCore.Query.QueryMethodProvider.<_ShapedQuery>d__3`1.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType) 
    at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType) 
    at Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter.WriteObject(TextWriter writer, Object value) 
    at Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter.<WriteResponseBodyAsync>d__9.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeResultAsync>d__32.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeResultFilterAsync>d__31.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeAllResultFiltersAsync>d__29.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeResourceFilterAsync>d__23.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeAsync>d__18.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Builder.RouterMiddleware.<Invoke>d__4.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Hosting.Internal.RequestServicesContainerMiddleware.<Invoke>d__3.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame`1.<RequestProcessingAsync>d__2.MoveNext() 
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2] 
     Request finished in 787.4541ms 200 application/json; charset=utf-8 

ポイント:

public object GetMatchupByVideoId(int id) 
{ 
    var videoMatchup = _DBContext.Videos 
     .Where(v => v.VideoID == id) 
     .Select(v => new { 
      id = v.MatchupID, 
      players = v.Matchup.Players.Select(mp => new 
      { 
       character = new { 
        name = mp.Character.Name, 
        votes = v.Matchup.MatchupVotes 
         .Where(mv => mv.CharacterID == mp.CharacterID) 
         .Count() 
       }, 
       outcome = mp.Outcome 
      }) 
     }); 

    return videoMatchup; 
} 

votesで、クエリの最後に.Count()を追加し、私はエラーを取得しますメッセージはここにある:

SQLite Error 1: 'no such column: v.Matchup.MatchupID'. 

前のクエリが.Count()なしで働いていた場合、私はこのエラーを取得し、なぜ私はわかりませんよ。さらに、私は質問に全くv.Matchup.MatchupIDを使用していません。私は、これが基になるSQLがやっていることが想像できるだけです。ここで

VideoPlayerため、「対戦, and MatchupVote`私のモデルです:

public class Video 
{ 
    [JsonPropertyAttribute("id")] 
    public int VideoID { get; set; } 
    [ForeignKeyAttribute("Game")] 
    public int GameID { get; set; } 
    public Game Game { get; set; } 
    [ForeignKeyAttribute("Matchup")] 
    public int MatchupID { get; set; } 
    public Matchup Matchup { get; set; } 
    [ForeignKeyAttribute("User")] 
    public int UserID { get; set; } 
    public User User { get; set; } 
    public string YoutubeID { get; set; } 
    public string Description { get; set; } 
    public string Title { get; set; } 
} 

public class Player 
{ 
    [JsonPropertyAttribute("id")] 
    public int PlayerID { get; set; } 
    public int CharacterID { get; set; } 
    public Character Character { get; set; } 
    public Players.Outcomes Outcome { get; set; } 
} 

public class Matchup 
{ 
    [JsonPropertyAttribute("id")] 
    [Required] 
    public int MatchupID { get; set; } 
    public List<MatchupVote> MatchupVotes { get; set; } 
    public List<Player> Players { get; set; } 
} 

public class MatchupVote 
{ 
    [JsonPropertyAttribute("id")] 
    public int MatchupVoteID { get; set; } 
    [ForeignKeyAttribute("Character")] 
    public int CharacterID { get; set; } 
    [ForeignKeyAttribute("Matchup")] 
    public int MatchupID { get; set; } 
    public Matchup Matchup { get; set; } 
} 

だから、私の質問は、私は私が望む票の数を取得するには、このような.Count()メソッドを使用する方法であり、私の質問の各キャラクターについて?

私はこのプロジェクトに.NET CoreとEntity Framework Coreを使用しています。

+0

あなたのテーブル構造は?ビデオクラスとプレーヤークラス!投稿を更新する – Aravind

+0

@Aravind私は更新しました。 – Sethen

+0

ここでは、ゲームクラスとユーザークラスの外部キーを参照しています。これらの2つのクラスで逆方向ナビゲーションプロパティを設定したかどうか確認してください。可能であれば更新する – Aravind

答えて

3

誰かがこの問題を抱えている場合のコメントからの回答です。

_DBContext.MatchupVotes.Where(mv => mv.CharacterID == mp.CharacterID).Count() 

パフォーマンスの点では、基になるSQLがフィルタリングされた別個のカウントを実行しているので、違いはありません。私はパフォーマンスについて懸念していたスーパープロファイラをチェックするだろうが、フィルタリングされたカウントなので、あなたが試していたものに対してパフォーマンスヒットがあるとは思わないだろう。

関連する問題