LINQ查询基于匹配另一个表

时间:2017-07-14 16:16:24

标签: c# linq

我是C#和LINQ的新手,并且无法设计必要的查询和/或代码。我在这里研究过,Microsoft docs,C#in a Nutshell,并且学到了很多,但似乎无法正确应用它。

数据源是SQL Express,5个简单的小表。我结束了一些渐进的设计,为自己澄清。我的MeetingDetail类型具有属性int PartnerID,它与Employees表Employee.ID相关 - > MeetingDetail.PartnerID。我希望我的新类型包含基于此匹配的合作伙伴名称的属性。源属性是db.Employees.LastName和FirstName,都是String类型。

var filtered = db.MeetingDetails.Where(v => v.GroupID == ID);

var recentMeetingRowQuery = from meeting in filtered
select new
{
    Date = meeting.MeetingDate,
    Category = meeting.Category.Name,
    Partner = (db.Employees.Where(v => v.ID == meeting.PartnerID).Select(x => x.LastName))
};

似乎这会为Partner属性返回错误的类型,并且我已经以各种方式尝试过ToString()。

enter image description here

1 个答案:

答案 0 :(得分:2)

使用 join 匹配两个表中的记录:

var recentMeetingRowQuery = 
       from meeting in db.MeetingDetails.Where(m => m.GroupID == ID)
       join employee in db.Employees on meeting.PartnerID equals employee.ID 
       select new {
           Date = meeting.MeetingDate,
           Category = meeting.Category.Name,
           Partner = employee.LastName
       };

注意:我假设您使用员工ID进行匹配,而v => ID == meeting.PartnerID实际应该是v => v.ID == meeting.PartnerID

  

似乎这会为Partner属性返回错误的类型

因为Select(x => x.LastName)返回IQueryable<string>。您可以通过添加.FirstOrDefault()来仅选择第一个匹配的员工姓名,但加入是更有效的解决方案。