У меня проблема с моим запросом, я ищу оборудование с их документами

Есть столы

ОБОРУДОВАНИЕ:

+----------+---------+----+ | PMRQTOTM | LIBELLE | TR | +----------+---------+----+ | 1234 | POMPE 3 | 1 | | 1245 | POMPE 3 | 2 | | 1145 | POMPE 4 | 2 | +----------+---------+----+

ДОКУМЕНТ:

+----------+------+-------+ | PMRQTOTM | TYPE | REF | +----------+------+-------+ | 1234 | ADR | 5647 | | 1234 | DSI | 5748 | | 1145 | ADR | 4758 | +----------+------+-------+

Модель :

public class CapitalisationViewModel
{
    public string PMRQTOTM { get; set; }
    public string LIBELLE { get; set; }
    public int TR { get; set; }
    public List<DOCUMENT> Docs {get; set;}
}

И, наконец, запрос ma linq:

from capi in northwind.CAPITALISATION
from documents in northwind.DOCUMENT.Where(documents => documents.PMRQTOTM == capi.PMRQTOTM).DefaultIfEmpty()
// <== left join
select new
{
  capi.PMRQTOTM,
  capi.LIBELLE,
  capi.TR,
  documents.TYPE,
  documents.REF,
})

Как я могу заполнить List<DOCUMENT>?

-1
AnTho 27 Окт 2015 в 16:42

2 ответа

Лучший ответ

При возврате наборов результатов главный / подробный вам не нужны левые соединения. Просто следуйте «естественному» пути:

var result = 
    (from capi in northwind.CAPITALISATION
    select new CapitalisationViewModel
    {
        PMRQTOTM = capi.PMRQTOTM,
        LIBELLE = capi.LIBELLE,
        TR = capi.TR,
        Docs = northwind.DOCUMENT.Where(documents => documents.PMRQTOTM == capi.PMRQTOTM).ToList()
    })
    .ToList();

Если вы определили правильные свойства навигации в своей модели сущности, вам даже не нужно думать о соединениях. Например, обычно у вас будет свойство навигации Documents в вашем CAPITALISATION объекте, поэтому приведенное выше будет просто

var result = 
    (from capi in northwind.CAPITALISATION
    select new CapitalisationViewModel
    {
        PMRQTOTM = capi.PMRQTOTM,
        LIBELLE = capi.LIBELLE,
        TR = capi.TR,
        Docs = capi.Documents.ToList()
    })
    .ToList();
1
Ivan Stoev 27 Окт 2015 в 14:33

Вот пример, он не требует пояснений:

            var capLst = new List<CapitalisationViewModel>();

        var cap1 = new CapitalisationViewModel();
        cap1.PMRQTOTM = 1234;
        cap1.LIBELLE = "POMPE 3";
        cap1.TR = 1;

        var cap2 = new CapitalisationViewModel();
        cap2.PMRQTOTM = 1245;
        cap2.LIBELLE = "POMPE 3";
        cap2.TR = 2;

        var cap3 = new CapitalisationViewModel();
        cap3.PMRQTOTM = 1145;
        cap3.LIBELLE = "POMPE 4";
        cap3.TR = 2;

        capLst.Add(cap1);
        capLst.Add(cap2);
        capLst.Add(cap3);


        var docLst = new List<DOCUMENT>();

        var doc1 = new DOCUMENT();
        doc1.PMRQTOTM = 1234;
        doc1.TYPE = "ADR";
        doc1.REF = 5647;

        var doc2 = new DOCUMENT();
        doc2.PMRQTOTM = 1234;
        doc2.TYPE = "DSI ";
        doc2.REF = 5748;

        var doc3 = new DOCUMENT();
        doc3.PMRQTOTM = 1145;
        doc3.TYPE = "ADR";
        doc3.REF = 4758;

        var doc4 = new DOCUMENT();
        doc4.PMRQTOTM = 1145;
        doc4.TYPE = "ADR";
        doc4.REF = 4758;

        docLst.Add(doc1);
        docLst.Add(doc2);
        docLst.Add(doc3);
        docLst.Add(doc4);

        //left join
        var res = (from cap in capLst
                   join
                   doc in docLst
                   on cap.PMRQTOTM equals doc.PMRQTOTM
                   into grouping
                   from doc in grouping.DefaultIfEmpty()
                   select new
                   {
                       cap.PMRQTOTM,
                       doc
                   }).ToList();

        //Capitalisation with Doc List
        var result =
            (from capi in capLst
             select new CapitalisationViewModel
             {
                 PMRQTOTM = capi.PMRQTOTM,
                 LIBELLE = capi.LIBELLE,
                 TR = capi.TR,
                 Docs = docLst.Where(documents => documents.PMRQTOTM == capi.PMRQTOTM).ToList()
             })
            .ToList();
0
lucas 27 Окт 2015 в 14:48