2010-03-25 44 views
1

結果如何創建由LINQ返回一組結果爲sql如下面的一個方法:的LINQ to SQL返回組由法

internal SomeTypeIDontKnow GetDivisionsList(string year) 
{ 
    var divisions = from p in db.cm_SDPs 
          where p.acad_period == year 
          group p by new 
          { 
           p.Division 
          } into g 
          select new 
          { 
           g.Key.Division 
          }; 
    return divisions; 
} 

我似乎無法定義正確的返回類型。我認爲這是因爲它是一個匿名類型,但還沒有得到我的頭。我是否需要將其轉換爲列表或其他內容?

結果只會用於填充組合框。

+0

您應該可以將鼠標移到返回行的「divisions」名稱上,智能感知將顯示變量的類型。 – 2010-03-25 14:19:48

回答

4

你不能*返回一個匿名類型。

要麼你需要弄清楚你的查詢返回的是什麼類型,並且要特別返回,或者你可以重命名方法BindDivisionsList(...)並在方法內執行你的數據綁定。

我建議你使用前(使你的類型在這裏一些假設): -

internal IEnumerable<Division> GetDivisionsList(string year) 
{ 
    IEnumerable<Division> divisions = 
     from p in db.cm_SDPs 
     where p.acad_period == year 
     group p by new 
     { 
      p.Division 
     } into g 
     select g.Key.Division; 

    return divisions; 
} 

或交替(我一般會做這種方式): -

internal IEnumerable<Division> GetDivisionsList(string year) 
{ 
    IEnumerable<Division> divisions = 
     db.cm_SPDs.Where(x => x.acad_period == year) 
        .Select(x => x.Division) 
        .Distinct(); 

    return divisions; 
} 

編輯: *你可以,只是沒有用 - 你必須返回「對象」。請參閱: -

http://msdn.microsoft.com/en-us/library/bb397696.aspx

- 但除非你有一個很好的理由,你可能想用命名的類型來工作時,您可以。

+0

感謝您對現在排序的幫助。我知道我可以在方法中綁定,但希望儘可能將類保持與UI分開。 – PeteT 2010-03-25 13:54:11

0

LINQ是「懶惰」。你需要做一個ToList()(或任何其他appropriet方法)並得到一個IEnumerable<T>Read this關於延遲加載。

1

你不是真的返回'group by'結果 - 你只是返回一個常規的L​​INQ集合(在這種情況下,IEnumerable<Division>)。正如Iain指出的那樣,您可以使用.Distinct運算符獲得相同的結果,而不是分組,然後從這些組中進行選擇。

如果你想返回實際的團體成績方面,你可能結果集轉換爲Dictionary<Key, List<Element>> - 這將無法返回原生的那種類型,但IGrouping界面似乎是可能同構這個結構。

爲了換句話說,當我需要圖象的IGrouping結構,I畫面的字典,其中每個鍵/值對是一組,與

  • 每個鍵表示所述組的不同值By子句
  • 每個值都表示原始集合中與Group By子句匹配的元素,即組的成員。