尝试在linq sql查询中按行分组时丢失别名,在这种情况下如何按行分组

时间:2013-10-04 18:16:52

标签: sql linq count group-by

我是一个新手实习生的方式,我保证我已经彻底研究了这个并尝试了很多不同的东西。以下linq查询有效,但我希望按行和名字对行进行分组,然后只显示多次出现的行。当我取消注释group by语句时,下面的所有别名都变得无法识别,将它们更改为实际的db.table名称也无济于事。

 var query = from emps in db.Employees

              join c in db.Cards on emps.SbiID equals c.SbiID

              where c.StateID == 0 && c.CardNumberNumeric > 100000

             //group emps by new {emps.Surname, emps.Name}; 

             //orderby grp.Count()  // something like 'where grp.Count > 1

              select new 
              { 

                  Surname = emps.Surname,
                  Name = emps.Name,
                  CorpID = emps.Identifier,
                  CardNum = c.CardNumber,
                  CostCenter = emps.EmployeeUserField.UF13,
                  Supervisor = (from e in db.Employees
                               where                                                  
                               e.Identifier.Equals(emps.EmployeeUserField.UF5)
                               select e.Surname).FirstOrDefault()
                               + ", "
                               + (from e in db.Employees
                                  where e.Identifier.Equals(emps.EmployeeUserField.UF5)
                                  select e.Name).FirstOrDefault(),

                 SupervisorID = emps.EmployeeUserField.UF5,
                 EmpCommence = emps.CommencementDateTime,
                 CardCommence = c.CommencementDateTime,
                 WorkPhone = emps.Telephone,
                 State = (from cf in db.ComboFields
                          from sp in db.StringProperties
                          where cf.ComboIndex.Equals(c.StateID)
                          && cf.StringID.Equals(sp.StringID)
                          && cf.TableName.Equals("Card")
                          && cf.FieldName.Equals("StateID")

                         select sp.DefaultValue).FirstOrDefault()                                       

             };          

 this.tagsGridView.DataSource = query;
 this.tagsGridView.DataBind();

1 个答案:

答案 0 :(得分:0)

我认为你遇到的问题是你没有适当地平息你的小组。例如:

var duplicateEmployees = db.Employees
    .GroupBy(emp => emp, new EmployeeComparer())
    .Where(grp => grp.Count() > 1)
    .SelectMany(grp => grp.AsEnumerable());

var duplicateEmployeeInfo =
    from emps in duplicateEmployees
    join c in db.Cards on emps.SbiID equals c.SbiID
    where c.StateID == 0 && c.CardNumberNumeric > 100000
    select new
    {
        ... what to select
    };

使用:

public class EmployeeComparer : IEqualityComparer<Employee>
{
    public bool Equals(Employee x, Employee y)
    {
        return x.Surname == y.Surname && x.Name == y.Name;
    }
    public int GetHashCode(Employee obj)
    {
        unchecked { return (17 * obj.Surname.GetHashCode()) ^ (23 * obj.Name.GetHashCode()); }
    }
}

按名称对员工进行分组,查找具有计数&gt;的组。 1,然后返回这些组的元素。不保证性能,但这应该可以解决您的问题。