我目前有一个LINQ语句,它返回一个IQueryable,显示在Telerik RadGrid中。此语句设置为拉出与输入的Period匹配的记录,并将“Premium”列设置为true。然后选择EmployeeID& ProjectID明显使用GroupBy属性。
然后,这些列将显示在RadGrid中,同时显示“PremiumCode”列。 目前我的声明用于显示符合最高凭证(员工姓名,项目,高级代码)的所有记录,但我的最终目标是仅提取不要已经拥有的记录为该特定员工分配给项目的“PremiumCode”。
public static IQueryable GetEmptyPremiums(string Period)
{
DataContext Data = new DataContext();
var PR = (from c in Data.System_Times
where c.Period == Period && c.Premium == true
orderby c.System_Employee.LName
select c).GroupBy(s => s.EmployeeID & s.ProjectID).Select(x => x.FirstOrDefault());
return PR;
}
目前正在正常显示,但正在显示每条记录,而不仅仅是需要PremiumCode的记录。
有没有办法重新处理我的LINQ语句,只包含需要一个PremiumCode的记录?
修改
周杰伦
我试图修改你的解决方案以满足我的需求,但遗憾的是没有成功。在定义Premium代码之前,不会添加Premium表中的记录,因此永远不会有null“PremiumCode”。
更清楚地描述我的最终目标:我希望在网格中显示信息,如上图所示。显示的记录将是将bool值“Premium”选为true但在Premium Table中没有PremiumCode记录的不同时间记录。
如果选中的记录在Premium表中有匹配的记录(EmployeeID,ProjectID 匹配),那么已经拥有高级代码集,并且不需要显示在网格中。
如果选中的记录在Premium表中没有匹配的记录(EmployeeID,而ProjectID 不匹配),则需要一个PremiumCode,并且需要在网格。
我相信这可以通过“.Any()”来实现,但我在调整语法和逻辑方面遇到了麻烦,无法正确显示这个网格。
答案 0 :(得分:2)
怎么样:
DataContext Data = new DataContext();
var projectsWithoutPremium = Data.Premiums.Where(p => p.PremiumCode == null)
.Select(p => p.ProjectId);
var PR = (from c in Data.System_Times
where c.Period == Period && c.Premium == true
&& projectsWithoutPremium.Contains(c.ProjectId)
orderby c.System_Employee.LName
select c).GroupBy(s => s.EmployeeID & s.ProjectID).Select(x => x.FirstOrDefault());
return PR;
DataContext Data = new DataContext();
var PR = (from c in Data.System_Times
where c.Period == Period && c.Premium == true
&& !Data.Premiums.Any(p => p.ProjectID == c.ProjectID && p.EmployeeID == c.ProjectID)
orderby c.System_Employee.LName select c)
.GroupBy(s => s.EmployeeID & s.ProjectID)
.Select(x => x.FirstOrDefault());
return PR;
答案 1 :(得分:0)
如果高级代码是字符串,您可能希望尝试在GroupBy子句之前添加.Where(x => string.isNullOrEmpty(x.PremiumCode))
之类的内容。