как можно объединить и сгруппировать по идентификатору между двумя таблицами и получить сумму полей - Linq C# через идентификатор? - PullRequest
1 голос
/ 21 июня 2020
  private class DataBindingProjection
    {
        public int WorkerId { get; set; }
        public string WorkerName { get; set; }
        public string Address { get; set; }
        public string Contact { get; set; }
        public string ReferenceName { get; set; }
        public string ReferenceContact { get; set; }
        public int TotalDistribute { get; set; }
        public int TotalCollection { get; set; }
        public int TotalDeposit { get; set; }
        public int TotalPayment { get; set; }
        public int TotalPayable { get; set; }
    }

    private void WorkerLIstForm_Load(object sender, EventArgs e)
    {
        var totalDistributed = (db.Distributions.AsEnumerable().GroupBy(d => d.WorkerId)).Select(a => new
        {
            WorkerId = a.Key,
            Amount = a.Sum(r => r.Piece)
        }).ToList();

        var collection = (db.Collections.AsEnumerable().GroupBy(d => d.WorkerId)).Select(a => new
        {
            WorkerId = a.Key,
            Piece = a.Sum(r => r.Piece),
            Deposit = a.Sum(r => r.PayableDeposit)

        }).ToList();

        var workerPayment = (db.WorkerPayments.AsEnumerable().GroupBy(d => d.WorkerId)).Select(a => new
        {
            WorkerId = a.Key,
            Payment = a.Sum(r => r.Payment),
            PayableAmount = a.Sum(r => r.PayableAmount)
        }).ToList();


        var worker = from w in db.Workers
                     join d in totalDistributed on w.WorkerId equals d.WorkerId
                     join c in collection on d.WorkerId equals c.WorkerId
                     join wp in workerPayment on w.WorkerId equals wp.WorkerId
                     select new DataBindingProjection
                     {
                         WorkerId = w.WorkerId,
                         WorkerName = w.WorkerName,
                         Address = w.Address,
                         Contact = w.Contact,
                         ReferenceName = w.ReferenceName,
                         ReferenceContact = w.RefereceContact,
                         TotalDistribute = d.Amount,
                         TotalCollection = c.Piece,
                         TotalDeposit = c.Deposit,
                         TotalPayment = wp.Payment,
                         TotalPayable = wp.PayableAmount
                     };
        workerDataGridView.DataSource = worker.ToList();

    }

Это мой код. Я хочу загрузить данные через workerId и суммировать их столбец c, но я сталкиваюсь с этой ошибкой .. System.NotSupportedException: «Невозможно создать постоянное значение типа« Анонимный тип ». В этом контексте поддерживаются только примитивные типы или типы перечисления. '

  1. Мой код неправильный?
  2. Если он неправильный, какой правильный или лучший подход для этого?

Ответы [ 3 ]

0 голосов
/ 21 июня 2020

Первое, что вы можете попробовать:

var worker = from w in db.Workers
     .Where(w => totalDistributed.Select(td => td.WorkerId).Contains(w.WorkerId))
     .Select(w =>  new {  w.WorkerId,
                         w.WorkerName,
                         w.Address,
                         w.Contact,
                         w.ReferenceName,
                         w.RefereceContact})
     .ToList()
    join d in totalDistributed on w.WorkerId equals d.WorkerId
....

Также я бы сказал, что вы можете попытаться выполнить весь этот запрос на стороне базы данных. Попробуйте удалить AsEnumerable и ToList из workerPayment, collection и totalDistributed в исходном коде.

0 голосов
/ 21 июня 2020
  private class DataBindingProjection
    {
        public int CustomerId { get; set; }
        public string CustomerName { get; set; }
        public string Address { get; set; }
        public string Contact { get; set; }
        public string ReferenceName { get; set; }
        public string ReferenceContact { get; set; }
        public int TotalSaleOfPiece { get; set; }
        public int TotalReturn { get; set; }
        public int TotalDue { get; set; }

    }

    private void CustomerListForm_Load(object sender, EventArgs e)
    {
        var customer = from c in db.Customers
                       join s in db.Sales on c.CustomerId equals s.CustomerId
                       group c by new { c.CustomerId } into y
                       from customer1 in db.Customers.DefaultIfEmpty().ToList()
                       select new DataBindingProjection
                       {
                           CustomerId = customer1.CustomerId,
                           CustomerName = customer1.ShopName,
                           Address = customer1.Address,
                           Contact = customer1.Contact,
                           ReferenceName = customer1.ReferenceName,
                           ReferenceContact = customer1.RefereceContact,
                           TotalSaleOfPiece = customer1.Sales.Sum(m => (int?)m.Piece) ?? 0,
                           TotalReturn = customer1.Sales.Sum(m => (int?)m.ReturnPiece) ?? 0,
                           TotalDue = customer1.Sales.Sum(m => (int?)m.Due) ?? 0,
                       };
        customerDataGridView.DataSource = customer.ToList();
    }

// при правильном использовании этого кода данные загружаются в режиме Drid View, но 1 данные повторяются 3 раза, в чем проблема?

0 голосов
/ 21 июня 2020

вы не можете присоединиться к LINQ-запросу с локальным списком объектов, потому что он не может быть преобразован в SQL.

Поэтому используйте решения, которые предоставлены здесь.

Невозможно создать постоянное значение типа В этом контексте поддерживаются только примитивные типы или типы перечисления

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