2010-03-25 40 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子句匹配的元素,即组的成员。