Использование max и объединение в linq с помощью c # - PullRequest
0 голосов
/ 22 февраля 2010

У меня есть таблицы master-detail и я хочу получить список master join с detial, где детализация в некоторых файлах максимальна. например, у меня есть таблица с именем Document, а также дочерняя таблица с именем Revision. Я хочу получить список соединений документа Revision, где значение Revision filed равно ? Одно из решений:

using ( ProcurementDataContext dc = new ProcurementDataContext() )
{

    var temp = from ddr in dc.E_DesignDocumentRevisions
               group ddr by ddr.DesignDocumentID into g
               select new { MaxRevision = g.Max(x => x.Revision), g.Key };

    var result = from t in temp
            join ddr in dc.E_DesignDocumentRevisions
            on new { DesignDocumentID = t.Key, Revision = t.MaxRevision } equals new { ddr.DesignDocumentID, ddr.Revision }
            join dd in dc.E_DesignDocuments
            on ddr.DesignDocumentID equals dd.ID
            where dd.DesignDocumentTypeID == DesignDocumentTypes.MR
            select new { ddr.ID, dd.DocumentNumber };

    foreach (var item in result )
    {
        dic.Add(item.ID, item.DocumentNumber.ToString());
    }

}

Как я могу сделать это всего за один запрос?

Ответы [ 2 ]

1 голос
/ 23 февраля 2010

Резервуары за вашу помощь. Вы правы, но я нашел отличный способ с очень маленьким запросом:

 var result = from ddr in db.E_DesignDocumentRevisions
                         group ddr by new
                                          {
                                              ddr.DesignDocumentID,
                                              ddr.E_DesignDocument.DocumentNumber
                                          }
                         into g
                         select new
                                    {
                                        MaxRevision = g.Max(x => x.Revision),
                                        g.Key.DesignDocumentID,
                                        g.Key.DocumentNumber
                                    };

Когда мы используем поля из некоторых таблиц (более одной) в предложении Group by, linq присоединяет их к сгенерированному запросу. Снова танки

1 голос
/ 22 февраля 2010

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

Однако, если вы хотите просто объединить оба блока, вы можете просто вставить первый во второй:

var result = from t in from 
                    ddr in dc.E_DesignDocumentRevisions
                    group ddr by ddr.DesignDocumentID into g
                    select new { MaxRevision = g.Max(x => x.Revision), g.Key }
             join ddr in dc.E_DesignDocumentRevisions
             on new { DesignDocumentID = t.Key, Revision = t.MaxRevision } equals new { ddr.DesignDocumentID, ddr.Revision }
             join dd in dc.E_DesignDocuments
             on ddr.DesignDocumentID equals dd.ID
             where dd.DesignDocumentTypeID == DesignDocumentTypes.MR
             select new { ddr.ID, dd.DocumentNumber };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...