Запрос Linq-to-SQL (AsEnumerable) для нескольких таблиц - PullRequest
1 голос
/ 09 мая 2019

Вот запрос Linq-to-SQL, который использует только одну таблицу из моей базы данных SQL Server и отлично работает:

private void GetData()
{
    DateTime d = DateTime.Now;

    using (DataClasses1DataContext dc = new DataClasses1DataContext())
    {
        var qte = dc.ENTREES_STOCKS.AsEnumerable()
                    .Where(x => x.ENTSTK_LOT == lot)
                    .Where(x => x.ART_CODE == artCode)
                    .Where(x => x.ENTSTK_USER == null)
                    .Select(s => new 
                                 {
                                     art = s.ART_CODE,
                                     date = s.ENTSTK_DTENTREE,
                                     numLot = s.ENTSTK_LOT,
                                     pnet = s.ENTSTK_PNET,
                                     nbu = s.ENTSTK_NBU
                                 })
                    .GroupBy(g => new { g.art, g.date, g.numLot })
                    .Select(n => new 
                                 {
                                    n.Key.art,
                                    n.Key.date,
                                    n.Key.numLot,
                                    pnet = n.Sum(x => Math.Round(Convert.ToDecimal(x.pnet), 2)),
                                    nbu = n.Sum(x => Math.Round(Convert.ToDecimal(x.nbu), 2)),
                                  });
        QEntreeTB.Text = qte.First().pnet.ToString();
        NbuEntreeTB.Text = qte.First().nbu.ToString();
    }
}

Как я могу изменить этот код, чтобы присоединить другие таблицы к этому запросу, например:

private void GetData()
{
        DateTime d = DateTime.Now;
        using (DataClasses1DataContext dc = new DataClasses1DataContext())
        {

             var qte = dc.ENTREES_STOCKS.AsEnumerable()
             // Thoseline of codes of course doesn't work
             join art in dc.FICHES_ARTICLES on ENTREES_STOCKS.ART_CODE equals art.ART_CODE
             join ent in dc.STK_ENT on art.ART_CODE equals ent.ART_CODE
             ....
             //
                 .Where(x => x.ENTSTK_LOT == lot)
                 .Where(x => x.ART_CODE == artCode)
                 .Where(x => x.ENTSTK_USER == null)

                 .Select(s =>
                 new
                 {
                     art = s.ART_CODE,
                     date = s.ENTSTK_DTENTREE,
                     numLot = s.ENTSTK_LOT,
                     pnet = s.ENTSTK_PNET,
                     nbu = s.ENTSTK_NBU
                 }
             )
             .GroupBy(g => new { g.art, g.date, g.numLot })
             .Select(n =>
                 new
                 {
                     n.Key.art,
                     n.Key.date,
                     n.Key.numLot,
                     pnet = n.Sum(x => Math.Round(Convert.ToDecimal(x.pnet), 2)),
                     nbu = n.Sum(x => Math.Round(Convert.ToDecimal(x.nbu), 2)),
                 }
             );
             QEntreeTB.Text = qte.First().pnet.ToString();
             NbuEntreeTB.Text = qte.First().nbu.ToString();
        }
    }

Или есть способ кодировать этот запрос по-другому ??Потому что на самом деле я просто хочу объединить несколько таблиц, сгруппировать некоторые поля и суммировать другие поля.

1 Ответ

0 голосов
/ 09 мая 2019

Во-первых, вызов AsEnumerable немного избыточен. Тогда вы можете просто использовать метод расширения Join.

var qte = dc.ENTREES_STOCKS
                 .JOIN(dc.FICHES_ARTICLES,art=>art.ART_CODE, stock => stock.ART_CODE)
                 .JOIN(dc.STK_ENT,ent => ent.ART_CODE,stock => stock.ART_CODE)
                 .Where(x => x.ENTSTK_LOT == lot)
                 .Where(x => x.ART_CODE == artCode)
                 .Where(x => x.ENTSTK_USER == null)
                 ....

Вы можете найти больше ответов здесь: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/language-reference/method-based-query-syntax-examples-join-operators

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...