2013-10-07 158 views
-1

我一直在寻求答案这一个,但我仍然有问题,想知道我在做什么错表....左连接Linq中

我有我的MVC项目和正在使用LINQ获取数据从我的数据库中的两个表。我需要离开加入第二台但我得到一个错误

对象引用不设置到对象

的问题是在我的模型,特别是在工作台的一个实例加入。这里是我的代码:

public void DATA(string searchString) 
     { 
      newList = new List<ResultsList>(); 

      var res = from f in searchDB.CUSTOMERS 

         join cd in searchDB.CUSTOMER_DETAILS 
         on f.cust_id equals cd.cust_id into grouped 
         from gr in grouped.DefaultIfEmpty() 

         where f.ProductName.Equals(searchString) 
         select new { f, gr }; 


     foreach (var item in surname) 
     { 
      ResultsList rl = new ResultsList(); 

      rl.Forename = item.f.Forename; 
      rl.Postcode = item.gr.postcode; 
      rl.ProductName = item.f.ProductName; 

      newList.Add(rl); 
     } 
    } 
+1

修正你的代码。 *姓*的定义在哪里? – dovid

回答

-5

对不起,它应该是“水库”,但这不是问题。无论如何,我已经解决了。如果任何人有兴趣,这是我如何做到这一点。

在foreach部分

,我添加了一个if语句,看看在连接表列是否为空,然后应用我所需要的一切减去其他的联接的列我用两个表中所需的一切。

foreach (var item in res) 
     { 
      ResultsList rl = new ResultsList(); 

      if (item.gr != null) 
      { 
       rl.Forename = item.f.Forename; 
       rl.Postcode = item.gr.postcode; 
       rl.ProductName = item.f.ProductName; 
      } 
      else 
      { 
       rl.Forename = item.f.Forename; 
       rl.ProductName = item.f.ProductName; 

      } 
+4

你的问题问linq实体和​​左连接,但你忽略了建议的解决方案,并接受了你自己的答案,事实上并没有直接回答你的问题(尽管它可能已经解决了你的问题) –

4

可以简化代码并获得通过写作摆脱for循环:

var rl = (from f in searchDB.CUSTOMERS 
      join cd in searchDB.CUSTOMER_DETAILS 
      on f.cust_id equals cd.cust_id into grouped 
      from gr in grouped.DefaultIfEmpty() 
      where f.ProductName == searchString 
      select new ResultsList 
      { 
       Forename = f.Forename, 
       Postcode = gr == null ? null : gr.postcode, 
       ProductName = f.ProductName 
      }).ToList(); 

它可能只Postcode = gr.postcode也行。取决于Linq数据库提供者的智能程度。