在linq sql查询中尝试按行分组时丢失别名,在这种情况下如何按行分组
我是一个新手实习生,我保证我已经对此进行了彻底的研究,并尝试了许多不同的东西。下面的linq查询可以工作,但我想按姓和名对行进行分组,然后只显示出现多次的行。当我取消注释GROUPBY语句时,下面的所有别名都无法识别,将它们更改为实际的db.table名称也无济于事在linq sql查询中尝试按行分组时丢失别名,在这种情况下如何按行分组,sql,linq,count,group-by,Sql,Linq,Count,Group By,我是一个新手实习生,我保证我已经对此进行了彻底的研究,并尝试了许多不同的东西。下面的linq查询可以工作,但我想按姓和名对行进行分组,然后只显示出现多次的行。当我取消注释GROUPBY语句时,下面的所有别名都无法识别,将它们更改为实际的db.table名称也无济于事 var query = from emps in db.Employees join c in db.Cards on emps.SbiID equals c.SbiID
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();
我认为你遇到的问题是你没有适当地将你的团队扁平化。例如:
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
};
与:
公共类EmployeeComparer:IEqualityComparer
{
公共布尔等于(员工x,员工y)
{
返回x.姓氏==y.姓氏和x.姓名==y.姓名;
}
public int GetHashCode(员工对象)
{
未选中{返回(17*obj.names.GetHashCode())^(23*obj.Name.GetHashCode());}
}
}
这将按名称对员工进行分组,查找计数大于1的组,然后返回这些组的元素。没有性能保证,但这应该可以解决您的问题。谢谢您的帮助;但是,我收到一个错误“无法访问已处置对象”[ObjectDisposedException:无法访问已处置对象。对象名称:“DataContext在Dispose之后访问”。]不知道您是否知道这可能是什么原因以及如何修复。
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()); }
}
}