2017-01-02 19 views
0

私はlinqクエリを作成して単一の最小値を出力しています。しかし、私は間違った最小値を取得し続けます。私はそれが参加の問題だと確信していますが、私は外部の参加を得ることができません。私は他の投稿に基づいていくつかの外部結合を試みましたが、何もできません。私はこの作業をするために外部結合に必要なテーブルが不明です。私は私ができるすべての組み合わせを考えてみました。Linqクエリで希望の結果が得られません

(from r in Results 
    join entry in Entries on r.EntryId equals entry.EntryId 
    join entryEvent in EntryEvents on entry.EntryId equals entryEvent.EntryId 
    join eswimmer in EntrySwimmers on entry.EntryId equals eswimmer.EntryId 
    where eswimmer.SwimmerId == 12027 && entryEvent.EventNumberId == 1233 
    select r.Time) 
.Min(); 

外の試みジョイン:

from r in Results 
join en in Entries on r.EntryId equals en.EntryId 
join ev in EntryEvents on en.EntryId equals ev.EntryId into evJoined 
join s in EntrySwimmers on en.EntryId equals s.EntryId into sJoined 
from ev in evJoined.DefaultIfEmpty() 
from s in sJoined.DefaultIfEmpty() 
where (s.SwimmerId == 12027 && ev.EventNumberId == 1233) 
select r.Time; 

問題は、私がではなく、スイマーのために、すべての結果の最小値を取得していますということです

ここで私が始めたクエリがありますそのスイマーの最小値と特定のイベント。

クラスの構造は次のようになります。

結果

public int ResultId 
public int EntryId 
public ICollection<Entry> Entry 
public int EntryEventId 
public ICollection<EntryEvent> EntryEvent 
public TimeSpan Time 

エントリ

public int EntryId 
public ICollection<EntrySwimmer> EntrySwimmers 
public Result Results 
public ICollection<EntryEvent> EntryEvents 

EntryEvents

public int EntryEventId 
public int EventNumberId 
public EventNumber EventNumbers 
public int EntryId 
public Entry Entry 

EntrySwimmers

public int EntryId 
public Entry Entries 
public int SwimmerId 
public Swimmer Swimmers 

私はまだlinq、ジョイントなどについて学んでいますので、説明をいただければ幸いです。前もって感謝します!

+1

T-SQLで作業中のクエリを最初に作成し、そこから後方に作業します。 – Nkosi

+0

私はSQLで同じ結果を得ています。 – Wyatt

+0

このモデルは正しいですか? 'Entry'には多くの' EntryEvents' *と*多くの 'EntrySwimmers'があります。スイマーを特定の「EntryEvent」にどのようにリンクさせるつもりですか? –

答えて

0

あなたはすでにので、基本的に、あなたのORMはあなたのためにそれをカバーしますので、いずれかが加入する必要はありませんマッピングされたナビゲーションプロパティがあります。

var min = Results 
      .Include(x => x.Entry.Select(y => y.EntrySwimmers)) //here you should rename Entry to Entries ideally in your result class 
      .Include(x => x.Entry.Select(y => y.EntryEvents)) 
      .Where(x => x.Entry.EntrySwimmers.Any(y => y.SwimmerId == 12027) && x.EntryEvents.Any(y => y.EventNumberId == 1233))    
      .Min(x => x.Time); 

わからないあなたは結果ではといえエントリに両方のイベントを持っている理由を。

+0

私はあなたが持っているものを試しましたが、ICollection にEntrySwimmersの定義が含まれておらず、結果にEntryEventsの定義が含まれていないというメッセージが表示され続けます。 – Wyatt

+0

次に、マッピングが間違っているかどうかを確認する必要があります。あなたのマッピングが正確にDBとして設定されていることを確認する必要があります。 1対1、1対多の関係 – Yaser

+0

where句を次のように変更しました: 'Where(x => x.Entries.Any(y => y.EntrySwimmers.Any(e => e.SwimmerId == swimmerid)) && x.EntryEvent.Any(y => y.EventNumberId == eventid)) 'しかし、私は出力として00:00:00.00以外何も得ていません。私はマッピングをチェックし、彼らは私によく見える。私は特に何を探すべきですか? – Wyatt

関連する問題