2016-07-12 7 views
0

人は、バッシングする前に、私が調査したものと少し違います。最後の行エンティティフレームワークが選択されているかどうかを確認します。

public async Task<ParticipantTournament> GetParticipantTournamentByDescending(int tournamentId, int participantId) 
     { 
      var response = await _dbRepositories.TournamentParticipantMatchRepository 
       .Where(x => x.TournamentId == tournamentId) 
       .OrderByDescending(y => y.TournamentMatch.RoundNumber) 
       .ThenByDescending(y => y.TournamentMatch.Id) 
       .Include(x => x.Tournament) 
       .Include(x => x.Participant1) 
       .Include(x => x.Participant2) 
       .Include(x => x.TournamentMatch) 
       .Select(z => new TournamentParticipantMatchLogicDto 
       { 


        IsLastMatch = OneTrue() // <==== Problem here, 
        TournamentParticipantMatch = z 


       }).Where(x => (x.TournamentParticipantMatch.Participant1Id == participantId || x.TournamentParticipantMatch.Participant2Id == participantId)) 
       .ToListAsync(); 
      return new ParticipantTournament 
      { 
       ParticipantMatches = response, 
      }; 


     } 
     /** 
     * This may be something super dumb. But I couldnt' come up with something better. 
     * How do I detect the latest match? 
     * http://stackoverflow.com/questions/14687136/check-if-record-is-last-or-first-in-list-with-linq 
     * 
     * Well, after digging a little bit, I've found that this is not possible :o 
     * */ 
     private bool OneTrue() 
     { 
      if (!IsLast) return false; 
      IsLast = false; 
      return true; 
     } 

私はトーナメントのプラットフォームを構築しています:

は、私は現在、次のコードを持っています。最後の試合がどれかを知る必要があるので、プレイヤーに3回ではなく5回のラウンドを与えることができます。新しい列を作成してそれを虚偽または真実で埋めるのではなく、フィルタリングすることにしました。私はLINQの延期実行を利用できると思った:

  1. トーナメントからデータセット全体を選択する。
  2. 私は降順でそれを注文し、最後の行として最初の行を選択します。 (すべてのマッチが順番に挿入されたので、最大のIDが最後のものです)
    1. 次に、ユーザーからのもので、ユーザーからのものではないものを除外します。私はそれが仕事ができると思い

考えられる解決策: - 最後の試合のために、「真」の値を保持するboolean型の列を作成します。 - 仕様パターンの使用(この状況での適用方法はわかりませんが、式とFuncを使用しても正しくマップできませんでした) - すべてのIDを読み込み、それらのIDのうち最後のIDを選択します。これらのIDをすべてのユーザーが持つIDと比較します。残念ながら、これはデータベースへの余分な往復を追加します。

どうすればよいですか?

ありがとうございます!

P.S:OneTrue()メソッドは、何をするかを一度返し、falseを返します。明確化のために

編集 (クイックGoogleの検索後に何かを見つけることができませんでした): enter image description here

テーブルは、私が現在持っているデータのシミュレーションを示しています。私は現在のユーザーが必要とするものだけを抽出すればよいので、他の2行は必要ありません(表2参照)。これらの2つの行を選択すると、他のものは除外されますが、最終的に一致する可能性がありますが、この2つの行を選択するだけでわかりません。私は最初の試行からそれを照会することによって任意の冗長性を保存しようとしています。私は最後の試合が大会の最後であることを知っています

私がやっていることは、降順で(順序が決められているため)すべてを注文し、最後の試合として最後のものを選択することです。これは私がやってしまったものです

var temp = from e in _dbRepositories.TournamentParticipantMatchRepository 
      where (from f in _dbRepositories.TournamentParticipantMatchRepository 
        where f.TournamentId == tournamentId) 
        .Include(x => x.Tournament) 
      .Include(x => x.Participant1) 
      .Include(x => x.Participant2) 
      .Include(x => x.TournamentMatch) 
      .Select(z => new TournamentParticipantMatchLogicDto 
      { 


       IsLastMatch = false, // <==== Problem here, 
       TournamentParticipantMatch = z 


      }).Where(x => (x.TournamentParticipantMatch.Participant1Id == participantId || x.TournamentParticipantMatch.Participant2Id == participantId)) 
      .ToListAsync(); 

int maxResult= temp.Max(t => t.TournamentParticipantMatch.Id); 
var update= temp.SingleOrDefault(x => x.TournamentParticipantMatch.Id== maxResult); 

if(update!= null) 
    update.IsLastMatch= true; 
+0

コードが機能しないのは、メソッドをSQLに変換できないため、クエリでメソッドを呼び出すことができないためです。 '.Select()'の前に '.ToList()'を呼び出すことで、クエリをメモリに具体化することができます。'.ToList()'の前に ''( '')もあります。 –

+0

あなたの質問は分かりませんが、 'IsLastMatch = OneTrue()'を省略することはできません(デフォルトで 'false'になります)、そしてクエリの後に' response.First()。IsLastMatch = true; '(あなたのクエリは常に少なくとも1つの 'TournamentParticipantMatchLogicDto'を返すと仮定します)? –

+0

@StephenMuecke:コメントありがとうございました!私はちょうど私の質問を更新しました。私がしたいことは、できるだけ多くのデータベースへのラウンドトリップを避けることです。私はすべてを1つのクエリに絞ろうとしていました。それが可能でない場合、私はすべての値を抽出し、ポストフィルタを行います。 –

答えて

1

あなただけのように、LINQを使用して、戻り、それの後にデータのあなたのサブセットを照会できませんでした。あなたが改善を見たら私に教えてください!

public async Task<ParticipantTournament> GetParticipantTournamentByDescending(int tournamentId, int participantId) 
    { 
     var lastMatchId = await _dbRepositories.TournamentParticipantMatchRepository 
      .Where(x => x.TournamentId == tournamentId) 
      .OrderByDescending(y => y.TournamentMatch.RoundNumber) 
      .ThenByDescending(y => y.TournamentMatch.Id) 
      .Select(x => x.Id).FirstOrDefaultAsync(); 

     var response = await _dbRepositories.TournamentParticipantMatchRepository 
      .Where(x => x.TournamentId == tournamentId) 
      .Where(x => (x.Participant1Id == participantId || x.Participant2Id == participantId)) 
      .Include(x => x.Tournament) 
      .Include(x => x.Participant1) 
      .Include(x => x.Participant2) 
      .Include(x => x.TournamentMatch) 
      .ToListAsync(); 

      var logic = response.Select(z=> new TournamentParticipantMatchLogicDto 
      { 
       IsLastMatch = z.Id == lastMatchId, 
       TournamentParticipantMatch = z 
      }) 
      ; 
     return new ParticipantTournament 
     { 
      ParticipantMatches = logic, 
     }; 


    } 
+0

ありがとう!私はそれをすることができました!私は本当に必要なものよりもはるかに多くの行を抽出しているだけなので、データを抽出する前にフィルタリングを行いたいのです。 –

0

関連する問題