2015-07-06 67 views
1

我想按照有多少相關項目的順序返回項目列表。按照有多少相關項目的順序返回項目列表

想象下面的類。想象他們都有DbSets ... context.A ... context.B ...

class A 
{ 
    public ID { get; set; } 
} 

class B 
{ 
    public virtual A A { get; set; } 
} 

我試圖讓從B最相關的順序A項的列表。查詢可能如下所示:

IEnumerable<A> GetMostRelatedAs(int numberOfAsToReturn) 
{ 
    return this.context.A.SelectMany( 
     a => a.ID, 
     (whatever) => new 
     { 
      A = whatever, 
      RelatedBCount = this.context.B.Where(b => b.A.ID == whatever.ID) 
     }).OrderByDescending(x => x.RelatedBCount).Take(numberOfAsToReturn ); 
} 

我在哪裏查錯了?

+0

_「?我要去哪裏錯了」 _ - 也許你錯過了[?我怎麼問一個很好的問題(http://stackoverflow.com/help /如何問),因爲目前尚不清楚你期望它做什麼,它實際上做了什麼以及你試圖解決這些差異。 – CodeCaster

+0

我編輯了我的OP。我希望這有助於更多。 – Jimmyt1988

+0

你不能在你的查詢中使用'ABTuple',因爲SQL不理解它。其次,您可能需要調用'ToList()',以便實際執行鍼對數據庫的查詢。 –

回答

2

由於這樣的:

我試圖從B.

to from使這相當混亂得到的物品清單中最相關的順序,所以在這個基礎上我「M將不得不在黑暗中刺這一個:

IEnumerable<dynamic> GetMostRelatedAs(int numberOfAsToReturn) 
{ 
    var results = this.context.A 
     .GroupJoin(
      this.context.B, 
      a => a.ID, 
      b => b.A.ID, 
      (singleA, multipleBs) => new { 
        // this is the projection, so take here what you want 
        numberOfBs = multipleBs.Count(), 
        name = singleA.Name, 
        singleA.ViewCount 
       } 
      ) 
     .OrderByDescending(x => x.ViewCount) 
     .Take(numberOfAsToReturn) 
     .ToList(); 

     // here you can use automapper to project to a type that you can use 
     // So you could add the following method calls after the ToList() 
     // .Project(this.mappingEngine) 
     // .To<ClassThatRepresentsStructure>() 

     // The reason you don't map before the ToList is that you are already doing a projection with that anonymous type. 
    return results; 
} 

編輯

爲了解決意見:

IEnumerable<A> GetMostRelatedAs(int numberOfAsToReturn) 
{ 
    var results = this.context.A 
     .GroupJoin(
      this.context.B, 
      a => a.ID, 
      b => b.A.ID, 
      (singleA, multipleBs) => new { 
        // this is the projection, so take here what you want 
        numberOfBs = multipleBs.Count(), 
        name = singleA.Name, 
        singleA.ViewCount, 
        singleA 
       } 
      ) 
     .OrderByDescending(x => x.ViewCount) 
     .Take(numberOfAsToReturn) 
     .ToList() 
     .Select(x => x.singleA); 

    return results; 
} 
+0

有沒有辦法將動態轉換回A對象?或者只是在查詢中選擇singleA?如果沒有,那麼我最好使用原來聲明的Tuple類來保持其他開發人員的一切。 – Jimmyt1988

+0

我猜我不能只在返回的動態列表中做一個foreach循環,因爲我不能聲明新的A,因爲它將不再具有數據庫中的A ID。 – Jimmyt1988

+0

你在那個'new {}'中推出你想要的東西,所以你可以說'originalA = singleA' –