2013-12-18 4 views
0

Ситуациявыбирать различные результаты, используя Linq

У меня есть список объектов, и запрос Linq Я в настоящее время используется рассчитывает каждый элемент дважды. Это происходит потому, что данные настроены таким образом. Каждый номер PO будет иметь две строки, и я рассчитываю оба. Мне нужно только пересчитать.

PO Number Pallets 
123   5 
123   5 
234   8 
234   8 
345   2 
345   2 

Linq запрос

Pallets = (from o in this.OrdersModel 
      where o.Pallets != null 
      select double.Parse(o.Pallets)) 
      .Sum(); 

Предполагая, что каждый объект в наборе является OrderModel, когда этот запрос выполняется он будет возвращать 30 (все строки суммируются)

Желаемые Результат

Правильное количество поддонов должно быть 15, добавить каждый PO pal позволяет один раз.

Вместо этого я хотел бы, чтобы это было возможным выбрать отдельное число po, а затем добавить поддоны. Было бы очень легко добавить это условие в прямой SQL, но я имею малейшее представление о том, как это сделать в Linq.

Вопрос

  1. Есть быстрый и простой способ сделать отборное отчетливое число ра с помощью Linq?
  2. Если нет, то какой был бы лучший способ добиться чего-то подобного?
+0

Вы имеете в виду разные? Существует метод linq под названием Distinct(), хотя я использую лямбда-форму, поэтому я бы не смог советовать по вашему запросу – Liath

+0

Если у вас есть две записи для каждого номера заказа, как вы узнаете, какой из двух включить в свою сумму? –

+2

Ну, если вы хотите быстрое решение: Паллеты = Паллеты/2; – PeterRing

ответ

2

Есть быстрый и легкий способ сделать выбор отчетливый

Вы можете использовать GroupBy:

Pallets = (from o in this.OrdersModel.GroupBy(o => o.PONumber).Select(g => g.First()) 
      where o.Pallets != null 
      select double.Parse(o.Pallets)) 
      .Sum(); 

Но вы, вероятно, должны попытаться исправить вашу модель, чтобы вы этого не сделаете получить дубликаты записей в первую очередь!

+0

@D Stanley Это, безусловно, лучший подход. Мы еще не совсем поняли, что это еще не все. Но нам нужно будет, в конце концов, не заполнять каждую запись. Спасибо за ответ – zach

2

Попробуйте это:

Pallets = this.OrdersModel 
       .Where(x=>x.Paletts!=null).Distinct() 
       .Sum(x=>double.Parse(x.Pallets)); 

Как here сказано, что вам нужно реализовать IEquatable интерфейс, так что вы можете определить, какие элементы являются дубликатами (спасибо Рафаэлю за напоминание)

+1

Предположим, что 'IEquatable ' реализован –

+0

@ RaphaëlAlthaus да, конечно, я забыл упомянуть, что – wudzik

+0

@wudzik или использовать [Enumerable.Distinct Метод (IEnumerable , IEqualityComparer )] (http://msdn.microsoft.com/en-us/library/bb338049 (v = vs.110) .aspx) вместо реализации 'IEquatable' – Grundy

0

Ну, если вам нужно быстрое решение: Паллеты = Паллеты/2 Но это исправление, вы должны использовать разные.

Смежные вопросы