2013-11-24 2 views
0
나는 다음과 같은 수업을

에 가입 :여러 JLeft 외부는 LINQ

public class ItemGroupParameterBase : Master 
{ 
    public string Name { get; set; } 
    public int GroupID { get; set; } 
} 

public class ItemBase : Master 
{ 
    public string Name { get; set; } 
    public int GroupID { get; set; } 
} 

public class ItemParameter : Master 
{ 
    public int ItemID { get; set; } 
    public int GroupDetailID { get; set; } 
    public string Value { get; set; } 
} 

마스터 클래스는 공통의 ID가 있습니다. 항목 매개 변수의 ItemGroupParameterBase 및 Value에서 모든 그룹 매개 변수 이름을 표시해야합니다. 결과는 콤보 상자에서 선택한 항목을 기반으로합니다. 값을 찾을 수없는 경우에도 그룹 매개 변수 이름을 표시해야합니다. 나는 아래와 같이 시도했다.

var source = from itemGroupParameters in _job.ItemGroupParameterList 
      join items in _job.ItemList.Where(x => x.ID == Convert.ToInt32(cmbItem.SelectedValue)) on itemGroupParameters.GroupID equals items.GroupID into g1 
      from featureNames in g1.DefaultIfEmpty() 
      join itemParameters in _job.ItemParameterList.Where(x => x.ItemID == Convert.ToInt32(cmbItem.SelectedValue)) on featureNames.ID equals itemParameters.GroupDetailID into g2 
      from itemSubParameters in g2 
      select new 
      { 
       FeatureName = featureNames.Name, 
       Value = (itemSubParameters != null ? itemSubParameters.Value : String.Empty) 
      }; 

null 참조를 나타냅니다.

+0

예외의 세부 정보에 다른 세부 정보가 있습니까? linq 문에 중단 점을 배치하고'cmbItem.SelectedValue'가 null인지 확인하십시오. –

+0

아니요 색인을 검사 한 다음 데이터 만 채 웁니다. 내가 왼쪽 외부 파트를 작업하는 마지막 조인 파트를 제거하면 문제가 발생합니다. 세 번째 줄이 쿼리에서 삭제되면 작동하지만 itemparameters에서도 데이터를 사용할 수있는 경우에만 데이터를 제공합니다. – Akhil

답변

1

문제점을 발견했습니다. 사실 나는 DefaultIfEmpty()을 놓쳤습니다. 이제 작업 및 쿼리는 다음과 같습니다.

var source = from itemGroupParameters in _job.ItemGroupParameterList 
      join items in _job.ItemList.Where(x => x.ID == Convert.ToInt32(cmbItem.SelectedValue)) on itemGroupParameters.GroupID equals items.GroupID 
      join itemParameters in _job.ItemParameterList.Where(x => x.ItemID == Convert.ToInt32(cmbItem.SelectedValue)) on itemGroupParameters.ID equals itemParameters.GroupDetailID into g1 
      from itemSubParameters in g1.DefaultIfEmpty() 
      select new 
      { 
       FeatureName = itemGroupParameters.Name, 
       Value = (itemSubParameters != null ? itemSubParameters.Value : String.Empty) 
      };