2008-10-26 4 views
0

제 데이터베이스에서 양보권은 Firms와 다 대일 관계입니다 (각 양보권에는 FirmID가 있습니다). SqlMetal은이 관계를 캡처하고 적절한 클래스를 생성하여 각 양보에 Firm 요소를 갖게합니다.정상적으로 Linq에서 SQL 외래 키를 다루는 방법은 무엇입니까?

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

문제는 경우에 따라 사업 시행자가 기업에 할당되지 않은 것입니다 (C : I는 해당 기업에 대한 정보와 함께 양보의 목록을 반환합니다 (여기 간체) 쿼리에 바인딩 해요 .FirmID는) null의 경우, 그래서 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가 발생하지 않습니다 null (Firm_Title은 빈 문자열)이지만 우아하지 않다 : 그것은 객체 지향적이지 않으며, Linq to SQL이 이미 포착 한 모든 관계 정보를 활용하지 못한다.

이 상황을 해결할 수있는보다 효과적인 방법이 있습니까?

답변

1

@James Curran : 쿼리가 실제로 실행될 때마다 오류가 발생합니다. 예 : 그리드에 데이터 바인딩을하거나, .ToList을 적용하면됩니다.

VB.NET에는 새로운 진정한 3 진 구문 (여전히 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

+0

아니요, "개체 참조가 개체의 인스턴스로 설정되어 있지 않습니다"c.Firm 아무것도없는 경우 throw합니다. –

3

어디 오류를 얻고있다?

난 그냥 비슷한 LINQ 쿼리를 (VB.Net에서) 짓을했는지, 그리고 당신은 나중에 제목이 null 인 처리해야합니다

(제목 null로 설정) 잘 작동하지만 정말 아니다

LINQ 문제. 심지어 C#에서도 쉽게 처리 할 수 ​​있습니다.

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

Vb.net에서 이에 상응하는 항목은 Iif()를 사용하는 것이지만 작동시키지 못했습니다.

0

null 관계가 아닌 null 문자열을 선택하고 있기 때문에 his이 작동 중입니다. 객체 생성자의 그것과

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 
+0

생성자는 SqlMetal에 의해 자동으로 생성되므로이 방법을 사용하고 싶습니다. –

관련 문제