2016-01-13 4 views
0

У меня есть запрос LINQ, который работает для всего, за исключением тех случаев, когда местоположение равно 0, и я хочу подсчитать, сколько строк Inventory = locGroup.Count возвращает 0. Все остальные Функции подсчета работают нормально, когда местоположение равно 0, а Inventory = locGroup.Count отлично работает, когда местоположение не равно 0. Насколько я могу судить, вы не можете отлаживать оператор LINQ в VS, поэтому я не уверен, почему и как это происходит, т работы.linq count возвращает 0, если группа по столбцу равна 0

Не знаю, как отобразить эти табличные данные по SO

IMLOCN | IMPRIC | isSpecial | vehComments | numPics | Возраст

50 -------------- 5 ------------ 0 --------------- Y ----------------- 21 ------- 100

50 -------------- 5.8 ----------------- ------ 1 --------------- Y ----------------- 23 ------- 200

0 --------------- 2 ------------- 0 --------------- N ----------------- 0 --------- 5

0 --------------- 4- ------------ 0 --------------- N ----------------- 0 --- ------ 10

Ожидаемый результат

50 - 2 - 2 - 1 - 2 - 2 - 300

0 - 2 * - 2 - 0 - 0 - 0 - 15 * фактические результаты это a 0, но другие # остаются неизменными.

Dim summaryInfo = From p In infoTable 
    Group p By Location = p.Field(Of Byte)("IMLOCN") Into locGroup = Group 
     Select New With { 
       Key locGroup, 
        .Location = locGroup.Max(Function(r) r.Field(Of Byte)("IMLOCN")), 
        .Inventory = locGroup.Count(Function(r) r.Field(Of Byte)("IMLOCN")), 
        .Priced = locGroup.Count(Function(r) r.Field(Of Decimal)("IMPRIC") > 0), 
        .Special = locGroup.Count(Function(r) r.Field(Of Boolean)("isSpecial") = True), 
        .Commented = locGroup.Count(Function(r) r.Field(Of String)("vehComments") = "Y"), 
        .Pictures = locGroup.Count(Function(r) r.Field(Of Int32)("numPics") > 0), 
        .Age = locGroup.Sum(Function(r) r.Field(Of Int32)("AGE")) 
     } 
+0

Обеспечить ввод проб и ожидаемый выход. –

+0

Я смог получить то, что мне было нужно, указав locGroup.Count() и оставив анонимную функцию, но это не отвечает на мой вопрос о том, почему он не работает так, как это было для locGroup = 0 – Kevin

ответ

1

Я попытался повторить свой запрос в C#, и это то, что я использовал:

var infoTable=new []{ 
new { IMLOCN=50,IMPRIC=5.0,isSpecial=false,vehComments="Y",numPics=21,Age=100 }, 
new { IMLOCN=50,IMPRIC=5.8,isSpecial=true,vehComments="Y",numPics=23,Age=200 }, 
new { IMLOCN=0,IMPRIC=2.0,isSpecial=false,vehComments="N",numPics=0,Age=5 }, 
new { IMLOCN=0,IMPRIC=4.0,isSpecial=false,vehComments="N",numPics=0,Age=10 } 
}; 

var summaryInfo = infoTable 
    .GroupBy(i=>i.IMLOCN) 
    .Select(locGroup=> new { 
    Location=locGroup.Max(l=>l.IMLOCN), 
    Inventory=locGroup.Count(l=>l.IMLOCN>0), 
    Priced=locGroup.Count(l=>l.IMPRIC>0), 
    Special=locGroup.Count(l=>l.isSpecial), 
    Commented=locGroup.Count(l=>l.vehComments=="Y"), 
    Pictures=locGroup.Count(l=>l.numPics>0), 
    Age=locGroup.Sum(l=>l.Age) 
}); 

с этим результатом:

enter image description here

Не будучи VB. NET (и я редко использую синтаксис запроса), я немного смутил этот пункт: Location = p.Field(Of Byte)("IMLOCN"). Это сравнение, или это попытка установить временную переменную с именем Location? Эта строка: Location=locGroup.Max(l=>l.IMLOCN) - это прямой перевод, но я обычно использовал бы Location=locGroup.Key, так как это групповой ключ. В моих попытках ему не понравилось Inventory=locGroup.Count(l=>l.IMLOCN), в котором говорилось, что он не может преобразовать IMLOCN в логическое, что приводит меня к выводу, что вы неявно конвертируете IMLOCN в логическое, а поскольку 0 - false, это не считается их.

TLDR: .Count(lambda) принимает выражение lamda, которое возвращает true/false, чтобы определить, следует ли считать эту запись или нет. Он неявно преобразовывает IMLOCN в логическое для вас, и поскольку 0 преобразуется в false, он не учитывает эти записи. По сути, код, который у вас есть, не учитывает количество IMLOCN, он подсчитывает количество IMLOCN, которые прикрываются логическим значением true. Если вы хотите знать, сколько записей в группе, то .Count() - это то, что вы хотите.

+0

В качестве стороны обратите внимание, вы можете рассмотреть возможность просмотра программы под названием [LINQpad] (https://www.linqpad.net/). Он позволяет вам играть с запросами LINQ и видеть результаты в ясной и простой форме. Например, я думаю, что если вы запустили 'infoTable.GroupBy (i => i.IMLOCN).Dump() '(или эквивалент в VB) вы бы быстро увидели, что это возвращает, и с чем работает следующий' .Select'. Он помогает визуализировать то, что на самом деле происходит в вашем запросе на каждом шаге, тем более, что вы изучаете LINQ. –

+0

Спасибо за ваше объяснение, это имеет смысл. Я вообще не парень VB и просто пытался исправить устаревшее приложение. Мне нужно будет загрузить LINQpad, поэтому в один прекрасный день я смогу ответить на вопросы SO, а не просто спросить их. – Kevin