如何使用IQueryable对复杂对象执行GroupBy

时间:2017-06-30 12:52:45

标签: c# entity-framework

我正在寻找一种在复杂对象上进行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,显然这就是为什么它也不起作用。

2 个答案:

答案 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因为语句的来源应该是IQueryableGetAll会返回IEnumerable(显然,比较器的GroupBy重载不起作用)。