2016-07-13 3 views
2

저장되는 다양한 Phone을 설명하는 클래스가 있습니다. 때때로 Importance 속성은 null 일 수 있습니다. 여기에 내가 전화 번호와 계좌 번호가 지정된 값 세트와 일치하는 경우 PhoneTypeListInfo를 반환하는 함수를 정의하는 클래스Nullable 형식이며 .HasValue는 여전히 Null 예외를 throw합니다.

public class PhoneTypeListInfo 
{ 
    public string AccountNum { get; set; } 
    public int PhoneType { get; set; } 
    public string PhoneNum { get; set; } 

    public int Importance { get; set; } 
} 

입니다.

protected PhoneTypeListInfo RetrievePhoneType(string info, string acctNumber) 
    { 
     PhoneTypeListInfo type = xPhoneTypeList.Where(p => p.PhoneNum == info && p.AccountNum == acctNumber).FirstOrDefault(); 

     return type; 
    } 

이 모두 잘 작동합니다. 내가 겪고있는 문제는 아래 linq 쿼리입니다. PhoneTypeListInfo에서 '중요성'속성을 얻기를 제외하고, 다른 성분을 가진 다른 클래스를 사용하려고 내가 위에서 뭐하는 거지

List<AlertBasedPhones> xAccountPhones = new List<AlertBasedPhones>(); 
xAccountPhones = (from x in xAccountStuff 
        where x.Media == "Phone" 
        let p = RetrievePhoneType(x.Info, acct.AccountNumber) 
        let xyz = x.Importance = (p.Importance as int?).HasValue ? p.Importance : 0 
        orderby p.Importance descending 
        select x).ToList(); 

.

내 질문에 궁극적으로는 p.Importance이 null이되게하려면 무엇을해야하며, null이면 0으로 설정하여 x.Importance도 0으로 만듭니다.

+2

나는'p.Importannce'는 null이 아니라'p' 자체라고 생각하지 않습니다. –

+0

Scott이 맞다고 생각합니다.'RetrievePhoneType'이 null을 반환 할 수 있기 때문에 p 자체에 대한 추가 점검이 필요합니다. –

+0

null 프로 그래 게이트 연산자? 여기서 유용 할 수 있습니다. –

답변

6

으로 바꾸십시오. p.Importannce은 null이 아니지만 p입니다. 그것이 당신이 먼저 null을 검사 할 필요가있는 것입니다. C# 6을 사용하는 경우 ?. 연산자를 사용할 수 있습니다. (p.Importance as int?).HasValue ? p.Importance : 0에서 p.Importance ?? 0까지 로직을 smiplifiy 할 수도 있습니다. 둘 다 결합하면

List<AlertBasedPhones> xAccountPhones = new List<AlertBasedPhones>(); 
xAccountPhones = (from x in xAccountStuff 
         where x.Media == "Phone" 
         let p = RetrievePhoneType(x.Info, acct.AccountNumber) 
         let xyz = x.Importance = p?.Importance ?? 0 
         orderby p?.Importance descending 
         select x).ToList(); 
+0

p는 null이 아닙니다. 나는 로버츠의 대답을 테스트 할 것이지만, 대신에 3 진을 사용해야하는 것처럼 보입니다. –

+0

@ChrisClark 0 행이'xPhoneTypeList.Where (p => p.PhoneNum == info && p.AccountNum == acctNumber)와 일치하면''p'는 null이됩니다. 로버트의 대답은'null (null == p)'와 같은 null 체크를하고 있습니다. C# 6에서 소개 된 convient'?.'연산자를 사용하고 있습니다. –

+0

@ChrisClark 'xPhoneTypeList.Where (p => p.PhoneNum == info && p.AccountNum == acctNumber)'는 0 행을 반환 한 후'.FirstOrDefault()'를'.First()'로 변경하면 다음과 같이 예외가 발생합니다. 0 행이 있습니다 (그러나 0 행이 없으면 문제가되지 않습니다). –

2

삼항 연산자를 사용하십시오. p.Importance(null==p) ? 0 : p.Importance

관련 문제