2011-08-02 5 views
1

나는 다음과 같은 LINQ 쿼리는 데이터 테이블에서 하나 개 이상의 행을 끌어 쓴 :DataTable에 대한 LINQ의 경우 DefaultIfEmpty입니까?

var generalQuery = 
     from contact in contacts.AsEnumerable().DefaultIfEmpty() 
     where contact.Field<String>("CONTACT_TYPE").ToUpper() == "AGENT" 
     select new 
      { 
      AgentName = contact.Field<String>("FIRST_NAME") + " " + 
       contact.Field<String>("LAST_NAME"), 
      AgentPhoneNumber = contact.Field<String>("PHONE"), 
      AgentEmailAddress = contact.Field<String>("EMAIL") 
      }; 

나는 다음 LINQ 쿼리 출력의 값을 가진 클래스의 새로운 인스턴스의 속성을 설정하려고 :

var genInfo = new GeneralInformationType 
{ 
    AgentName = generalQuery.FirstOrDefault().AgentName, 
    AgentPhoneNumber = generalQuery.FirstOrDefault().AgentPhoneNumber, 
    AgentEmailAddress = generalQuery.FirstOrDefault().AgentEmailAddress 
}; 

문제는 내가 가끔 쿼리에 결과가 없다는 것입니다. 그러면 GeneralInformationType의 다양한 문자열 값이 null로 설정되고 예외가 발생합니다. DefaultIfEmpty의 다양한 메서드를 시도했지만 넣을 위치를 알아낼 수 없습니다.

도움을 주시면 감사하겠습니다.

감사합니다, 롭

답변

1

일반 쿼리에서 DefaultIfEmpty()을 제거하고 일부 로직을 추가하는 것이 좋습니다. generalQuery 다음과 같이 비어 있습니다.

var generalQuery = 
     from contact in contacts.AsEnumerable() 
     where contact.Field<String>("CONTACT_TYPE").ToUpper() == "AGENT" 
     select new 
      { 
      AgentName = contact.Field<String>("FIRST_NAME") + " " + 
       contact.Field<String>("LAST_NAME"), 
      AgentPhoneNumber = contact.Field<String>("PHONE"), 
      AgentEmailAddress = contact.Field<String>("EMAIL") 
      }; 

var genInfo = new GeneralInformationType 
{ 
    AgentName = generalQuery.Any() ? generalQuery.First().AgentName : "Default Name", 
    .... 
}; 
+0

두 답변이 모두 올바른 것처럼 보입니다. 나는 Jon의 것보다이 것을 선택했다. 그 방법은 내가 사용했고 중간의 "result"객체를 필요로하지 않았기 때문이다. 모든 도움을 주셔서 감사합니다! – SpaceCowboy74

1

여기에 두 개의 문제가 있습니다. 첫째, DefaultIfEmpty은 쿼리가 아무 것도 반환하지 않는 경우 효과적으로 DataRow 시퀀스를 제공합니다. 그러면 문자열을 할당하려고 시도하지 않을 때 오류가 발생하지만 Where 절에있는 경우 오류가 발생합니다. 그리고 을 사용합니다. FirstOrDefault은 일치하는 항목이 없을 경우 일반적으로 null을 반환합니다.

나는 개인적으로 DefaultIfEmpty 호출을 제거하고 genInfo의 코드에있는 모든 불이행을 둘 것 :

var generalQuery = 
     from contact in contacts.AsEnumerable() 
     where contact.Field<String>("CONTACT_TYPE").ToUpper() == "AGENT" 
     select new 
     { 
      AgentName = contact.Field<String>("FIRST_NAME") + " " + 
       contact.Field<String>("LAST_NAME"), 
      AgentPhoneNumber = contact.Field<String>("PHONE"), 
      AgentEmailAddress = contact.Field<String>("EMAIL") 
     }; 

// Like using DefaultIfEmpty(...).First() 
var result = generalQuery.FirstOrDefault() ?? 
     new { AgentName = "Default", 
       AgentPhoneNumber = "Default", 
       AgentEmailAddress = "Default" }; 

var genInfo = new GeneralInformationType 
{ 
    AgentName = result.AgentName, 
    AgentPhoneNumber = result.AgentPhoneNumber, 
    AgentEmailAddress = result.AgentEmailAddress 
}; 

은 확실히 당신이 원하는대로에 "기본"을 변경합니다. 더 구체적인 요구 사항이 있다면 무엇을하려고하는지 설명해주세요. 우리가 그들을 수용 할 수있을 것이라고 확신합니다.