sql server - Linq c#在导航属性上加入空值

本文关键字:属性 空值 导航 server Linq sql | 更新日期: 2023-09-27 18:01:23

我有这些类:

class Group 
{
    public int GroupID { get; set; }
    public string PlaceOfMeeting { get; set; }
    public int? PublisherID { get; set; }
    public IEnumerable<Publisher> Publishers { get; set; }
    public Publisher Publisher { get; set; }
}
class Publisher 
{
    public int PublisherID { get; set; }
    public int GroupID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MiddleName { get; set; }
    public int Gender { get; set; }
    public string Nationality{ get; set; }
}

和我想选择使用Linq数据集像这样:

查询

SELECT TOP 1000 [Groups].[GroupID],
    [Groups].[PlaceOfMeeting],
    [Groups].[PublisherID],
    [publisher].[MiddleName],
    [publisher].[Gender],
    [publisher].[Nationality]
FROM [dbo].[Groups]
left outer join Publisher
on Publisher.PublisherID = Groups.PublisherID

GroupID PlaceOfMeeting PublisherID midlename性别国籍

1安哥拉1科霍1加纳

2 Estate 2 Joe 1 ghana

3 Banchem 3 Kofi 1 ghana

4 Kwabedu NULL NULL NULL NULL

我想使用Linq来处理数据集或对象

我尝试过这样的东西,但我得到ArgumentNullException @第18行,消息是值不能为空因为传递给Publisher的一些记录值是空的

  List<ValueObjects.Group> GetAllGroups() {
        DataTable Groups = HelperClass.GetTable("Groups", connectionString);
        DataTable Publishers = HelperClass.GetTable("Publisher", connectionString);
        DataTable Contacts = HelperClass.GetTable("Contacts", connectionString);
        var groups = Groups.AsEnumerable();
        var publishers = Publishers.AsEnumerable();

        var group = from g in groups
                     join p in Publishers.AsEnumerable() on g.Field<int?>("PublisherID") equals p.Field<int?>("PublisherID") into g_p
                     from pub in g_p.DefaultIfEmpty()
                     select new Group()
                     {
                         GroupID = g.Field<int>("GroupID"),
                         PlaceOfMeeting = g.Field<string>("PlaceOfMeeting"),
                         Publisher = g.Field<int?>("PublisherID"),
                         Publisher = new Publisher()
                         {
                             PublisherID = pub.Field<int>("PublisherID"),
                             GroupID = pub.Field<int>("GroupID"),
                             FirstName = pub.Field<string>("FirstName"),
                             LastName = pub.Field<string>("LastName"),
                             MiddleName = pub.Field<string>("MiddleName"),
                             Gender = (Gender)pub.Field<int>("Gender"),
                             
                             Nationality = pub.Field<string>("Nationality"),
                         },
                         Publishers = from p in publishers.DefaultIfEmpty()
                                      where p.Field<int>("GroupID") == g.Field<int>("GroupID")
                                      join c in Contacts.AsEnumerable().DefaultIfEmpty() on p.Field<int>("PublisherID") equals c.Field<int>("PublisherID")
                                      select new Publisher
                                      {
                                          PublisherID = p.Field<int>("PublisherID"),
                                          GroupID = p.Field<int>("GroupID"),
                                          FirstName = p.Field<string>("FirstName"),
                                          LastName = p.Field<string>("LastName"),
                                          MiddleName = p.Field<string>("MiddleName"),
                                          Gender = (Gender)p.Field<int>("Gender"),
                                          
                                          Nationality = p.Field<string>("Nationality"),
                                          Contacts = new Contacts
                                          {
                                              Phone1 = c.Field<string>("Phone1"),
                                              Phone2 = c.Field<string>("Phone2")
                                          },
                                      }
                     };
        return group.ToList();
    }

sql server - Linq c#在导航属性上加入空值

这意味着有时publishernull,因为"外连接",即join ... into (GroupJoin)。

Publisher = new Publisher()
{
    ...
}

…由…

Publisher = pub == null ? default(Publisher) : new Publisher()
{
    PublisherID = pub.Field<int>("PublisherID"),
    GroupID = pub.Field<int>("GroupID"),
    FirstName = pub.Field<string>("FirstName"),
    LastName = pub.Field<string>("LastName"),
    MiddleName = pub.Field<string>("MiddleName"),
    Gender = (Gender)pub.Field<int>("Gender"),
    Nationality = pub.Field<string>("Nationality"),
},