LINQ To SQL - Каков наиболее эффективный способ прохождения мастера / детали? - PullRequest
1 голос
/ 14 июля 2009

Единственное, что я могу найти при работе с master / detail и LINQ, это привязка данных. Тем не менее, я использую LINQ для запроса своих данных, и мне нужно будет вручную просматривать результаты без необходимости привязки данных. Мое окончательное намерение состоит в том, чтобы просмотреть циклический набор основных результатов, получить сгруппированный список дочерних элементов и вывести основные / подробные данные в виде иерархической структуры в XML.

Моя иллюстрация: у меня есть таблица my_master_tbl, и она будет запрошена по дате. У меня есть дочерняя таблица my_child_tbl, которая будет сгруппирована по дате, по основному идентификатору и использую sum () для суммирования некоторых полей. Я хотел бы связать сгруппированные данные с мастером и пройтись по мастеру / детали наиболее эффективным способом, чтобы экспортировать результаты в формате XML. Что это за путь? Единственный способ, о котором я могу думать, - это циклически пройти по мастеру, а затем запросить сгруппированный результирующий набор дочерних элементов на основе master_id.

Ответы [ 2 ]

1 голос
/ 14 июля 2009

Я предлагаю сделать это либо как хранимую процедуру, которая возвращает наборы результатов, либо как запрос, который получает все основные данные, и другой запрос, который получает все дочерние данные. Таким образом, у вас есть это под рукой. Затем, когда вы выполняете итерацию по основным данным, у вас уже есть ВСЕ дочерние данные. Затем можно выполнить фильтрацию на стороне сервера для всех дочерних данных по текущему главному идентификатору ... и выполнить итерацию по всем дочерним данным.

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

0 голосов
/ 14 июля 2009

Я бы реализовал это, используя комбинацию LinqToSql и LinqToXml, аналогично следующему:

var query = new XDocument(
    new XElement("Results", from i in context.my_master_tbl
                            where i.ItemDate > DateTime.Now.AddDays(-7)
                            select new XElement("MasterItem",
                                new XAttribute("MasterName", i.Name),
                                 from c in i.my_child_tbl
                                 group c by c.Date into g
                                 select new XElement("Child",
                                     new XAttribute("Date", g.Key),
                                     new XAttribute("SumField", g.Sum(d => d.FieldToSum))
                                 )
                            )));

Вот некоторый результирующий XML, который будет сгенерирован:

<Results>
 <MasterItem MasterName="A">
  <Child Date="2009-01-15T00:00:00-06:00" SumField="491470" />
 </MasterItem>
 <MasterItem MasterName="B">
  <Child Date="2009-01-29T00:00:00-06:00" SumField="491526" />
 </MasterItem>
 <MasterItem MasterName="C">
  <Child Date="2009-01-15T00:00:00-06:00" SumField="1965960" />
  <Child Date="2009-07-14T00:00:00-05:00" SumField="-27" />
 </MasterItem>
 <MasterItem MasterName="D" />
 <MasterItem MasterName="E" />
</Results>

Я уверен, что вам нужно внести некоторые изменения в это на основе макета, который вы планируете использовать, но, надеюсь, это даст вам некоторые идеи.

Это также предполагает, что ваши отношения установлены между вашей основной и дочерней таблицами. Если это не так, потребуются некоторые другие изменения.

...