我有这些课程:
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到Dataset:
QUERY
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 MiddleName性别国籍
1安哥拉1 Kojo 1加纳人
2 Estate 2 Joe 1 Ghanaian
3 Banchem 3 Kofi 1 Ghanaian
4 Kwabedu NULL NULL NULL NULL
我想使用Linq转化为数据集或对象
我尝试了类似这样的东西但是得到了ArgumentNullException @第18行,而且消息是Value不能为空 因为传递给Publisher的某些记录值为null
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();
}
答案 0 :(得分:0)
这意味着有时候publisher
是null
,因为&#34;外部联接&#34;,即join ... into
(GroupJoin
)。更换零件......
Publisher = new Publisher()
{
...
}
... by ...
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"),
},