如何通过LINQ获取唯一记录

时间:2012-11-08 13:38:11

标签: c# sql linq linq-to-sql

var EmpRecList = (from ur in db.Users
  join ug in db.UserGroups on ur.UserGroupID equals ug.UserGroupID
  select new
  {
      lastName = ur.LastName, 
      userID = ur.UserID,
      firstName = ur.FirstName,
      userGroupName = ug.UserGroupNameLang1
  }).Where(oh => oh.userGroupName.StartsWith(userCur.UserGroupName))
                                  .OrderBy(x => x.lastName);

我有这段代码。这里的问题是,即时获取具有相同用户ID的2条记录。我想根据用户ID创建一个独特的记录。谢谢。尝试使用不同的方法,但没有成功。

3 个答案:

答案 0 :(得分:1)

您可以使用GroupBy而不是获得第一条记录。它会在订购后根据用户ID获取EmpRecList中的第一条记录,但不能确保您想要获得的结果。

试试这个

var EmpRecList = (from ur in db.Users
                  join ug in db.UserGroups on ur.UserGroupID equals ug.UserGroupID
                  select new
                  {
                      lastName = ur.LastName, 
                      userID = ur.UserID,
                      firstName = ur.FirstName,
                      userGroupName = ug.UserGroupNameLang1
                   })
                  .Where(oh => oh.userGroupName.StartsWith(userCur.UserGroupName))
                  .GroupBy(g => g.userID).Select(s => s.First()).ToList().OrderBy(x => x.lastName)

答案 1 :(得分:0)

这里的问题是你不是Users的明确列表,但你的LINQ查询正在将一些Users与多个UserGroups分组。由于UserGroups的不同,对此执行不同的操作不会为您提供唯一的列表。

您需要在where子句中解决此问题。它需要更具体。而不是您的谓词是StartsWith,而是使用Equals

var EmpRecList = (from ur in db.Users
  join ug in db.UserGroups on ur.UserGroupID equals ug.UserGroupID
  select new
  {
      lastName = ur.LastName, 
      userID = ur.UserID,
      firstName = ur.FirstName,
      userGroupName = ug.UserGroupNameLang1
  }).Where(oh => oh.userGroupName.Equals(userCur.UserGroupName))
    .OrderBy(x => x.lastName);

UserGroups用ID而不是名称进行比较实际上会更好。

答案 2 :(得分:0)

您可以跳过加入,因此具有多个组的用户不会出现两次。我假设组没有导航属性,但是如果有,你可以使用ur.UserGroups而不需要let定义。

var EmpRecList = (from ur in db.Users
  let groups = db.UserGroups.Where(ug => ur.UserGroupID == ug.UserGroupID)
  select new
  {
      lastName = ur.LastName, 
      userID = ur.UserID,
      firstName = ur.FirstName,
      userGroupNames = groups.Select(g => g.UserGroupNameLang1)
  }).Where(oh => oh.userGroupNames.Any(n => n.StartsWith(userCur.UserGroupName)))
                                  .OrderBy(x => x.lastName);