2017-01-02 8 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' * и * many '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, а Result не содержит определения для EntryEvents. – Wyatt

+0

Затем вы должны проверить свои сопоставления, чтобы узнать, что не так. Вы должны проверить, что ваши сопоставления заданы точно как DB, например. один к одному, от одного до нескольких отношений – Yaser

+0

Я изменил предложение 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

Смежные вопросы