2016-07-29 1 views
2

존재합니까? 이것을 계산하는 다른 방법이 있습니까?LINQ는 (는) 그룹에 합류하여 올바른 개수로

IList<DtoProfile> profileList = Session().QueryOver<DtoProfile>() 
IList<Headword> methodList = Session().QueryOver<Headword>() 
var hList = profileList.Select(x => x.HeadwordList).SelectMany(x => x).ToList(); 

profileList에는 HeadwordList가 있습니다. 지금 hList는

Headword1 같은 표제어 포함 ID = 1, 텍스트 = 텍스트 1
Headword2 (프로파일 1) ID = 1, 텍스트 : ID = 2, 텍스트 = 텍스트 2
Headword1 (프로파일 1)
Headword2 = 텍스트 1 ID = 1, 텍스트 : = 텍스트 1은 ( 프로필 2부터)

methodList는

Headword1 포함 I은 D = 2, 텍스트 = Headword2 텍스트 2
: ID = 3, 텍스트 = 텍스트 3

내가 같은 사전을 만들고 싶어

키 : 텍스트 1, 값 : 2
키 : 텍스트 2, 값 : 1
키 : 텍스트 3, 값 : 0

var joined = (from headword in methodList 
    join profile in hList on headword equals profile 
    group headword by headword.Text 
    into groupedProfile 
    select groupedProfile).ToDictionary(x => x.Key, x => x.Count()); 

이없는 작품! 난 그냥

키를 가지고 : 2
키 : 텍스트 1, 텍스트 2 값, 값 : 내 사전에 1
합니다. 지금 내가 왼쪽으로 개선 가입!

var joined = (from headword in methodList 
    join profile in hList on headword equals profile into ps 
    from profile in ps.DefaultIfEmpty() 
    group headword by headword.Text 
    into groupedProfile 
    select groupedProfile).ToDictionary(x => x.Key, x => x.Count(y => y != null)); 

그러나 Y => y는 = null이 아닌 제대로 작동! 내가 얻을 :

키 : 텍스트 1, 값 : 2
키 : 텍스트 2, 값 : 1
키 : 텍스트 3, 값 : 1

+0

이 QueryOver 메소드는 실제로 목록을 반환합니까? 대신에'IQueryable'으로 남겨두면 그것을 더 잘 최적화 할 수 있습니다. –

답변

2

나 '(잘못, 0이어야 함) 귀하의 문제를 이해한다면 정말로 확신 할 수 없지만 ...

var joined = methodList 
    .ToDictionary(item => item.Text, item => hList.Count(h => h.Text == item.Text)) 
+0

네, 이것이 제가 원하는 것입니다. 감사! – Xeddon