Linq-to-sql One-To-Many с максимальным - PullRequest
2 голосов
/ 04 февраля 2009

У меня чертовски много времени с этим. Это может быть недостаток сна ... или, может быть, я просто тупею.

У меня есть 2 таблицы:
а) Персона {Ключ, Имя, Фамилия}
б) LogEntry {Key, PersonKey, Log, EntryTime}

Я пытаюсь объединить Person и LogEntry, где LogEntry является последней версией LogEntry для данного Person.

Надеюсь, я не скажу "дух ..." через пять минут, когда ответы меня сильно поразят.

Ответы [ 3 ]

2 голосов
/ 04 февраля 2009

Если у вас есть отношения в SQLServer, вы должны иметь в классе Person что-то вроде Person.LogEntries. Вы можете сделать так:

   LogEntry logEntry = 
Person.LogEntries.OrderByDescending(p => p.EntryTime).FirstOrDefault();

Тогда вы можете проверить, является ли logEntry нулевым, если нет, у меня должна быть последняя запись в журнале для этого человека.

1 голос
/ 05 февраля 2009

Если у вас нет настройки отношений, принятый ответ может быть сделан:

var r = Person
    .GroupJoin(
        LogEntry,
        o => o.Key,
        i => i.PersonKey,
        (o,i) => new {o, Entry = i.OrderByDescending(x => x.EntryTime).First()});
0 голосов
/ 04 февраля 2009

В частичном классе для Person создайте новое свойство, похожее на это:

public partial Person
{
    public LogEntry RecentLogEntry
    {
        get
        {
            return LogEntries.OrderByDescending(l => l.EntryTime).FirstOrDefault();
        }
    }
}

Я считаю, что это (или что-то подобное) должно работать, хотя это по памяти. Это, конечно, зависит от присутствия ваших отношений.

Если вы предпочитаете делать это при выборе записей, попробуйте следующее:

var people = from p in context.People
             select new
             {
                 Person = p,
                 LatestLogEntry = p.LogEntries.OrderByDescending(l => l.EntryTime).FirstOrDefault()
             };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...