我正在寻找一种在复杂对象上进行GroupBy的方法,而不仅仅是一个属性。问题是我想在 IQueryable 上执行此操作,因为在这种情况下从表中获取所有数据是一个非常糟糕的主意。
我们正在使用Entity Framework 6.1。
该课程如下:
public class Pin {
public Guid Id {get;set;}
public Guid PageId {get;set;} /* this is the foreign key to our Pages-table */
public PageClass Page {get;set;} /* this is a relation */
}
我需要报告特定页面的时间和#34;固定",也打印页面的名称。
现在我的代码看起来像这样:
var pinnedPages = GetAll().GroupBy(x => x, comparer);
foreach (var pinnedPage in pinnedPages)
{
var numberOfTimesPinned = pinnedPage.Count();
var pin = pinnedPage.Key;
//write a line to the report
}
但如果我在PageId上进行分组,那么pinnedPage.Key
会返回一个Guid,显然,我需要整个Page
对象来满足我的报告需求。
我也尝试过实现自定义比较器,但这不能转换为SQL,显然这就是为什么它也不起作用。
答案 0 :(得分:1)
if(driver.findElement(By.id(elementId )).isDisplayed()){
CenterOnClick.testFail(elementId , driver);
FailScreenShot.test(caseId, driver, targetNumberCell);
}else{
driver.findElement(By.id(downloadId)).click();
TimeUnit.SECONDS.sleep(7);
}
这将在pageId上分组,但是select会创建一个新的匿名对象,它将包含键(pageId)并选择第一个GetAll().GroupBy(x => x.pageId).Select(_ => new {key = _.Key, page = _.FirstOrDefault().Page, count = _.Count()});
对象
答案 1 :(得分:1)
如果直接查询页面并使用我认为存在的导航属性(或者应该添加),则不需要任何分组:
var pinnedPages = context.Pages
.Select(p => new
{
Page = p
Pins = p.Pins.Count()
});
foreach (var pinnedPage in pinnedPages)
{
var numberOfTimesPinned = pinnedPage.Pins;
var pin = pinnedPage.Page;
//write a line to the report
}
我使用context.Pages
因为语句的来源应该是IQueryable
。 GetAll
会返回IEnumerable
(显然,比较器的GroupBy
重载不起作用)。