Linq中的左连接表

时间:2013-10-07 15:59:19

标签: c# linq-to-entities left-join

我已经找到了这个问题的答案,但我仍然遇到问题,并且想知道我做错了什么......

我有我的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);
        }
    }

2 个答案:

答案 0 :(得分: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数据库提供程序的智能程度。

答案 1 :(得分:-5)

抱歉,它应该是“res”,但这不是问题。无论如何我已经解决了这个问题如果有人有兴趣,我就是这样做的。

在foreach部分中,我添加了一个if语句来查看连接表中的列是否为null然后应用我需要的所有内容减去连接列,否则我使用了两个表中所需的所有内容。

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;

            }