2008-10-26 39 views
0

在我的數據庫中,讓步與企業有多對一的關係(每個讓步都有一個FirmID)。 SqlMetal已經捕獲了這種關係,並生成了適當的類,以便每個特許權擁有一個公司元素。如何正常處理Linq to SQL中的空外鍵?

From c as Concession in Db.Concessions _ 
Select _ 
    c.ConcessionID, _ 
    c.Title, _ 
    c.Firm.Title 

的問題是,在某些情況下,租界還沒有被分配到企業(C:我反對的查詢(這裏的簡化)與有關對應事務所信息一起返回減讓清單結合.FirmID爲空),所以c.Firm是什麼,我得到Object not set to an instance

我可以做如下連接解決這個問題:

From c As Concession In Db.Concessions _ 
Join f As Firm In Db.Firms On f.FirmID Equals c.FirmID _ 
Select _ 
    c.ConcessionID, _ 
    c.Title, _ 
    Firm_Title = f.Title 

這並不時拋出一個錯誤FirmID是空(Firm_Title只是一個空字符串),但它是不夠優雅:它不是面向對象的,並沒有充分利用Linq to SQL已經捕獲的所有關係智能。

有沒有更優雅的方式來處理這種情況?

回答

1

@James Curran:每次執行查詢時我都會收到錯誤信息 - 例如,如果我將數據綁定到它,或者我將.ToList應用於它。

VB.NET有一個新的真三元語法(比C#更詳細)。這實際上工作:

From c As Concession In db.Concessions _ 
Select _ 
    c.ConcessionID, _ 
    c.Title, _ 
    Firm_Title = If(c.Firm IsNot Nothing, c.Firm.Title, String.Empty) _ 

我不是很滿意,這種方法 - 這是一個痛苦不得不這樣做,與各個領域我可能會從外部表使用。我很想知道爲什麼你的查詢工作,而我的不是 - 你的DataContext是由SqlMetal生成的嗎?從數據庫推斷出的關係是什麼?

+0

我認爲你也可以這樣做:if(c.Firm.Title,String.Empty) – Kevin 2008-10-27 00:58:08

+0

不,如果c.Firm沒有任何內容,則拋出「未將對象引用設置爲對象的實例」。 – 2008-10-27 01:02:02

3

你在哪裏得到的錯誤?

我剛剛做了類似的LINQ查詢(在VB.Net),它工作得很好(標題設置爲null)

稍後您將不得不應對標題爲空,但是這不是一個真正的LINQ問題。 甚至可以很容易地在C#中處理。

from c in Db.Concessions 
select 
{ 
    c.ConcessionID, 
    c.Title, 
    Title = c.Firm.Title ?? "" 
} 

Vb.net中的等價物將使用Iif(),但我無法得到它的工作。

0

他正在工作,因爲他選擇的空字符串不是空關係。

0

對付它的對象構造

Public Property office() As String 
      Get 
       Return _office 
      End Get 
      Set(ByVal value As String) 
       If value IsNot Nothing Then 
        _office = value 
       Else 
        _office = String.Empty 
       End If 
      End Set 
     End Property