2016-11-25 74 views
0

這是我目前LINQ聲明:LINQ:如果導航屬性爲null設置默認值

var results = from l in leads 
    select new MyObject 
    { 
     LeadID = l.LeadID, 
     SelectedProposalEngineerID = l.LeadContacts.Where(contact => contact.LeadContactTypeID == LeadContactType.ProposalEngineer).FirstOrDefault().ContactID 
    }; 

我遇到的麻煩是,最後一個項目往往是空。所以,當我嘗試「結果」轉換到一個列表,我得到

{「演員到值類型‘System.Int32’失敗,因爲物化值爲null。無論是結果類型的泛型參數或查詢「}

我不想讓SelectedProposalEngineerID是一個空的int,對於會導致下游的問題。當它爲空時,我如何給它賦值0?

我已經看到很多關於這個的其他線程,但我似乎無法適應他們對這種情況的任何答案。

+0

兩個說明 - (1)你確定這個例外與SelectedProposalEngineerID有關嗎? (2)「最後一項」(通常爲空)是什麼意思?所選聯繫人上的潛在客戶,聯繫人或FirstOrDefault()? –

+0

好問題。在我查看這個 – user1418704

+0

好了之後,讓我再回到你的問題,所以LeadContact表中的行並不總是LeadContact.LeadId等於Lead.LeadId – user1418704

回答

4

使用DefaultIfEmpty擴展方法。

var results = from l in leads 
    select new MyObject 
    { 
     LeadID = l.LeadID, 
     SelectedProposalEngineerID = 
      l.LeadContacts.Where(contact => contact.LeadContactTypeID == LeadContactType.ProposalEngineer) 
          .Select(contact => contact.ContactID) 
          .DefaultIfEmpty(0) 
          .FirstOrDefault() 
    }; 
+0

這似乎已經奏效!謝謝! – user1418704

1
Nullable<int> ID; 
var results = from l in leads 
select new MyObject 
{ 
    LeadID = l.LeadID, 
    SelectedProposalEngineerID = (ID = l.LeadContacts.Where(contact => contact.LeadContactTypeID == LeadContactType.ProposalEngineer).FirstOrDefault().ContactID).HasValue ? ID.Value : 0; 
}; 

三元操作員應該完成這項工作。將結果賦給變量,如果不爲空,則將變量強制轉換爲int並返回,否則返回0.

+0

是的,我試過了那。我得到:操作員?不能應用於int和int類型? – user1418704

+0

你是對的,請參閱我對不同類型的編輯。 – Mat

+1

編輯我的答案只是爲了正確,@法比奧的答案是要走的路。 – Mat