2013-11-24 28 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中的所有组参数名称和项目参数中的值。结果基于我从组合框中选择的项目。即使未找到该值,我也需要显示组参数名称。我尝试下面。

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) 
      }; 

它显示空引用。

+0

在异常情况下做的细节显示任何其他细节?尝试在linq语句中放置一个断点并检查'cmbItem.SelectedValue'是否为空。 –

+0

不,我检查了索引,然后只填充数据。如果我删除它正在工作的最后一个连接部分,左边的外部是问题。如果第三行从查询中删除,它正在工作,但只有数据在项目参数中可用时才会提供数据 – 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) 
      };