【问题标题】:Linq join on multiple tables with null values使用空值对多个表进行 Linq 联接
【发布时间】:2014-01-01 11:31:56
【问题描述】:

我想从我的数据库构建中执行请求

Table Zipcodes
string Zipcode
string Description
string StateCode
string RegionCode
string CountryCode

Table States
string StateCode
string StateName

Table Region
string RegionCode
string RegionName

Table Country
string CountryCode
string CountryName

所以,我想用名称而不是代码列出我所有的邮政编码。

我的邮政编码表包含 8 行。 在 ZIPCode 表中,只有州代码可以为 Null。

这是我的要求:

var dset = from s in db.ZIPCODEs
join u in db.COUNTRies on s.COUNTRYCODE equals u.COUNTRYCODE
join v in db.STATES on s.STATECODE equas v.STATECODE 
join w in db.REGIONS on s.REGIONCODE equals w.REGIONCODE                     
select new ZIPCODEListViewModel
    {
    ID = s.ID,
    ZIPCODE1 = s.ZIPCODE1,
    DESCRIPTION = s.DESCRIPTION,
    STATECODE = s.STATECODE,
    CONTRYCODE = s.COUNTRYCODE,
    REGIONCODE = s.REGIONCODE,
    STATECODE = s.STATENAME,
    COUNTRYNAME =u.DESCRIPTION,
    STATENAME = v.DESCRIPTION,
    REGIONNAME = w.DESCRIPTION
   };

这将返回 0 行。

如果我只在 COUNTRY 和 REGION 上使用不包含空值的连接,我会收到所有行。

我的问题是:如何构建我的请求以返回所有行,并且在 Statename 中使用字符串或 null 是 Statecode 为 null ?

感谢您的帮助,对糟糕的英语和糟糕的 linq 能力深表歉意。

罗比

【问题讨论】:

    标签: c# sql asp.net-mvc linq


    【解决方案1】:

    非常感谢。

    它帮助我找到解决方案。

    var dset = from s in db.ZIPCODEs
               join u in db.COUNTRies on s.COUNTRYCODE equals u.COUNTRYCODE into ulist from u in ulist.DefaultIfEmpty()
               join w in db.REGIONS on s.REGIONCODE equals w.REGIONCODE into wlist from w in wlist.DefaultIfEmpty()      
               join v in db.STATES on s.STATECODE equals v.STATECODE into vlist from v in vlist.DefaultIfEmpty()                          
               select new ZIPCODEListViewModel
              {
                ID = s.ID,
                ZIPCODE1 = s.ZIPCODE1,
                DESCRIPTION = s.DESCRIPTION,
                STATECODE = s.STATECODE,
                COUNTRYCODE = s.COUNTRYCODE,
                REGIONCODE = s.REGIONCODE,
                COUNTRYNAME =u.DESCRIPTION,
                STATENAME = v.DESCRIPTION,
                REGIONNAME = w.DESCRIPTION
            };
    

    在无法通过连接解决的字段中返回我所有的空白行。

    罗比

    【讨论】:

      【解决方案2】:

      您需要使用 Group Join 而不是 Join。 Group Join 的工作方式与 SQL 中的 Left Join 相同。尝试以下查询:

      var dset = from s in db.ZIPCODEs
                 join u in db.COUNTRies on s.COUNTRYCODE equals u.COUNTRYCODE
                 Group Join v In db.STATES On s.STATECODE equas v.STATECODE
                     Into vlist = Group
                     From v In vlist.DefaultIfEmpty() 
                 join w in db.REGIONS on s.REGIONCODE equals w.REGIONCODE                     
                 select new ZIPCODEListViewModel
                {
                  ID = s.ID,
                  ZIPCODE1 = s.ZIPCODE1,
                  DESCRIPTION = s.DESCRIPTION,
                  STATECODE = s.STATECODE,
                  CONTRYCODE = s.COUNTRYCODE,
                  REGIONCODE = s.REGIONCODE,
                  STATECODE = s.STATENAME,
                  COUNTRYNAME =u.DESCRIPTION,
                  STATENAME = v.DESCRIPTION,
                  REGIONNAME = w.DESCRIPTION
              };
      

      【讨论】:

      • Group Join 语法在我的 C# 编译器中不起作用。但它帮助我找到解决方案。谢谢!
      • 亲爱的。我是 VB 程序员,所以组加入在 vb 方面工作得很好。
      猜你喜欢
      • 2013-10-06
      • 2012-10-22
      • 2021-02-17
      • 1970-01-01
      • 2018-03-30
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多