2009-06-03 7 views
0

먼저 널 (null)을 계산하는 방법, 위의 링크가 어떻게 가입 왼쪽으로 한 다음에 NULL 값이없는이 열을 선택합니다LINQ 가입,

LINQ to Dataset DBNULL problem/null reference exception

이 스레드에서 살펴 예외 오류가 발생했습니다.

int tmp1 = 
(
from n in dt_query 
join m in dt_query2 
on n.Field<string>("VC_CLIENT_MAXID") equals m.Field<string>("VC_CHAT_MAXID") into nm 
from m in nm.DefaultIfEmpty() 
where 
    //string.IsNullorEmpty(m.Field<string>("VC_CHAT_STAFF")) 
    //DBNull.Value.Equals(m.Field<string>("VC_CHAT_STAFF")) 
    //m.IsNull("VC_CHAT_STAFF") 
    //object.Equals(m.Field<string>("VC_CHAT_STAFF"), xxx) <<< String xxx = null on above 
    select n.Field<string>("VC_CLIENT_MAXID") 
    ).Count(); 

주석 처리 된 줄은 다음과 같습니다

내 문제는 내가 절 (내 LEFT은 가입 후, 일부 NULL 값이 열에서 팝업) WHERE 열이의 null COUNT이 뭔가를 원하는 것입니다 솔루션 시도했지만 그것은 나를 위해 작동하지 않았다. 어떤 도움을 주시면 감사하겠습니다.

답변

1

조인 된 테이블이 null 인 레코드 수를 계산하는 방법을 묻는다면이 시도해보십시오.

int tmp1 = 
    (
    from n in dt_query 
    join m in dt_query2 
    on n.Field<string>("VC_CLIENT_MAXID") 
     equals m.Field<string>("VC_CHAT_MAXID") into nm 

    from LeftJoinM in nm.DefaultIfEmpty() 
    where 

     LeftJoinM == null 

    select n.Field<string>("VC_CLIENT_MAXID") 
    ).Count(); 

내가 잘못 이해 한 경우 의견을 보내 주시면 업데이트 해 드리겠습니다.

+0

이 나를 위해 일한 (이 시간) 작동합니다 다음 code..Hope를 테스트하지 않았습니다! 하지만 물어볼 게 있습니다. "m == null"은 무엇을 의미합니까? 지정한 열의 NULL 필터를 사용하면이 필터가 작동하지 않는다고 생각합니다 (어쨌든 NULL을 확인한 열을 알 수 없기 때문입니다). 테이블 A에 조인 할 VC_CLIENT_MAXID가 있고 테이블 B의 VC_CHAT_STAFF가 처음부터 NULL이면 어떻게됩니까? 나는 틀린 대답을 얻을 것 같아? –

+0

좀 더 명확하게하기 위해 m을 "LeftJoinM"으로 변경했습니다. "m == null"또는 지금 "LeftJoinM == null"은 기본적으로 조인에 실패했는지 확인합니다. 조인 할 수없는 모든 레코드를 리턴합니다. –

+0

SELECT COUNT (*) from VC_CLIENT LEFT JOIN VC_CHAT ON VC_CLIENT_MAXID = VC_CHAT_MAXID 어디에서 VC_CHAT_STAFF가 NULL입니까? > 내 포인트는 "m == null"입니다.이 쿼리를 번역 할 수있는 완벽한 대답은 아닙니다. 보시다시피, VC_CHAT VC_CHAT_STAFF null 데이터가 있으면 "m == null"조인 실패한 행만 제공 할 수 있기 때문에 선택할 수 없습니다. 내가 맞습니까? 이 쿼리를 LINQ 구문으로 변환하겠습니까? 왜냐하면 나는 "m.Field ("VC_CHAT_STAFF ")"WHERE 절을 호출하려고했을 때 NullException을 얻었 기 때문입니다. 어쨌든 위 답변에 대해 고맙습니다. 그것은 나를 많이 돕는다! –

0

나는이

int tmp1 = 
     (
     from n in dt_query 
     join m in dt_query2 
     on n.Field<string>("VC_CLIENT_MAXID") 
      equals m.Field<string>("VC_CHAT_MAXID") into nm 

     from temp in nm.where(t => t.Field<string>("VC_CLIENT_MAXID") ==null).DefaultIfEmpty() 


     select VC_CLIENT_MAXID= (temp== null) ? "" :n.Field<string>("VC_CLIENT_MAXID"); 
     ).Count();