2013-06-07 2 views
2

У меня возникли проблемы с выполнением нескольких учетных записей в одной таблице в запросе LINQ. Я использую NHibernate, LINQ to NHibernate и C#.Несколько счетчиков для одной таблицы в запросе LINQ

запрос - это заполненный список. У меня есть таблица с булевым именем FullRef. Я хочу сделать запрос LINQ, чтобы дать счетчик событий FullRef = false и FullRef = true для каждого TrackId. TrackId получает новую строку для каждого раза, когда он получает трек. Источник == «UserRef».

В следующем запросе я получаю правильный счетчик чисел (из FullRefTrueCount) FullRef = true, но он дает неизвестный неверный номер на FullRefFalseCount.

var query2 = from track in query 
    where track.Source == "UserRef" 
    group track by new { TrackId = track.TrackId, FullRef = track.FullRef } into d 

    select new FullReferrer 
    { 
     Customer = d.Key.TrackId, 
     FullRefFalseCount = d.Where(x => x.FullRef == false).Count(), 
     FullRefTrueCount = d.Where(x => x.FullRef == true).Count() 
    }; 

Я также попытался изменить его, чтобы он не содержал FullRef в группе. Это было сделано путем удаления FullRef = track.FullRef на подобном этим

var query2 = from track in query 
    where track.Source == "UserRef" 
    group track by new { TrackId = track.TrackId } into d 

    select new FullReferrer 
    { 
     Customer = d.Key.TrackId, 
     FullRefFalseCount = d.Where(x => x.FullRef == false).Count(), 
     FullRefTrueCount = d.Where(x => x.FullRef == true).Count() 
    }; 

Теперь он дает мне общий кол TrackID, игнорируя мой .гд (х => x.FullRef == истины/ложь) заявление ,

У кого-нибудь есть идеи по его устранению? Я думаю, что это проблема «группа». Могу ли я как-то избежать группы? Возможно, мне нужно присоединиться?

ответ

0

кому-либо еще, имеющий подобную проблему я решил ее сделать это.» AsEnumerable() "

var query2 = from track in query.AsEnumerable() // <--- the solution 
    where track.Source == "UserRef" 
    group track by new { TrackId = track.TrackId } into d 

    select new FullReferrer 
    { 
     Customer = d.Key.TrackId, 
     FullRefFalseCount = d.Count(x => !x.FullRef), 
     FullRefTrueCount = d.Count(x => !x.FullRef) 
    }; 
0

Попробуйте счет (состояние).

FullRefFalseCount = d.Count(x => x.FullRef == false), 
    FullRefTrueCount = d.Count(x => x.FullRef == true) 
+0

Извините, это не сработало для меня. Тогда запрос не дает никаких результатов («Перечисление не дало никаких результатов») – user2107630

1
FullRefFalseCount = d.Where(x => x.FullRef == false).ToList().Count 
FullRefTrueCount = d.Where(x => x.FullRef == true).ToList().Count 

попробовать это

+0

Это тоже не работает. Предполагая, что вы имели в виду .Count(), а не. – user2107630

0

попробовать это. Это берет ожидаемые данные из таблицы данных.

string source = "UserRef"; 
var result = from row in dt.AsEnumerable() 
      where row["source"].Equals(source) 
      group row by row["TrackId"] 
      into g 
      select new 
       { 
        TrackId = g.Key, 
        FullRefTrueCount = ((from track in g where track["FullRef"].Equals("true") select track).Count()), 
        FullRefFalseCount = ((from track in g where track["FullRef"].Equals("false") select track).Count()) 
       }; 
+0

Это дает то же самое, к сожалению – user2107630

3

Для NHibernate я не знаю, но с помощью Linq С Entity Framework это должно получить то, что вы хотите:

var query2 = (
    from track in someDbSet 
    select new FullReferrer 
    { 
      Customer = track.trackId 
     , FullRefFalseCount = (from fullRefFalse in someDbSet.tracks 
           where fullRefFalse.IsSale == false 
           && fullRefFalse.trackId == track.trackId 
           select fullRefFalse).Count() 
     , FullRefTrueCount = (from fullRefTrue in someDbSet.tracks 
           where fullRefTrue.IsSale == true 
           && fullRefTrue.trackId == track.trackId 
           select fullRefTrue).Count() 
    } 
).Distinct();