LINQ to sql返回组的方法结果

时间:2010-03-25 12:22:11

标签: c# linq-to-sql

如何创建一个方法来将LINQ中的组结果返回到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;
}

我似乎无法定义正确的返回类型。我认为这是因为它是一种匿名类型,但还没有解决它。我需要将其转换为列表或其他内容吗?

结果只会用于填充组合框。

3 个答案:

答案 0 :(得分: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

- 但除非你有充分的理由,否则你可能希望尽可能使用命名类型。

答案 1 :(得分:1)

你并没有真正返回'group by'结果 - 你只是返回一个常规的L​​INQ集合(在这种情况下,IEnumerable<Division>)。正如Iain指出的那样,你可以使用.Distinct运算符获得相同的结果,而不是分组,然后从这些组中进行选择。

如果您确实想要返回实际的组结果,可能会将结果集转换为Dictionary<Key, List<Element>> - 它将无法原生返回该类型,但IGrouping界面似乎可能与此结构同构。

顺便说一下,当我需要想象一个IGrouping结构时,我想象一个字典,其中每个键/值对是一个组,

  • 每个键代表Group By子句中的不同值
  • 表示原始集合中与Group By子句匹配的元素的每个值,即组的成员。

答案 2 :(得分:0)

LINQ是“懒惰的”。您需要执行ToList()(或任何其他appropriet方法)并获得IEnumerable<T>Read this关于延迟加载。