我应该使用哪种类型的聚合查询?

时间:2010-02-18 21:45:05

标签: c# linq linq-to-sql return-value

我刚刚开始使用LINQ to SQL,并且需要一些建议来实现一个简单的场景:

我有一个方法ListTagCounts正在使用LINQ To SQL进行聚合查询。我不确定要使用的返回类型,因此使用ToList()方法并为返回类型创建了一个类,以便让它进行编译。

架构:

Link         LinkTag      Tag
----------   ----------   ----------
LinkID       LinkID       TagID
URL          TagID        Name
IsDeleted

代码:

static void Main(string[] args)
{
    var counts = ListTagCounts();
    foreach(var c in counts)
        Console.WriteLine("Tag: {0}, Count: {1}", c.Tag, c.Count);
    Console.ReadKey();
}

public static List<MyReturnClass> ListTagCounts()
{
    List<MyReturnClass> counts;
    using (var db = new MyDbDataContext())
    {
        counts = (from t in db.Tags
                  join lt in db.LinkTags on t.TagID equals lt.TagID
                  join l in db.Links on lt.LinkID equals l.LinkID
                  where l.IsDeleted == false
                  select new MyReturnClass() { Tag = t.Name, Count = t.LinkTags.Count() }
        ).Distinct().OrderBy(t => t.Tag).ToList();
    }
    return counts;
}

public class MyReturnClass
{
    public string Tag { get; set; }
    public int Count { get; set; }
}

如果我这样做

select new { Tag = t.Name, Count = t.LinkTags.Count() }

而不是

select new MyReturnClass() { Tag = t.Name, Count = t.LinkTags.Count() }

在我的LINQ查询中,返回类型应该是什么?

3 个答案:

答案 0 :(得分:1)

使用以下语法时:

select new { Tag = ..., Count = ... };

您正在创建anonymous type。编译器会在编译时为您生成此类型的名称,因此您无法知道它是什么。

当您在选择此匿名类型的实例的查询上调用ToList时,您可能会返回列表,因为List实现了一些非泛型类(显然不依赖于类型参数T,您不是你知道吗,你可以施展。

一般情况下,您不应该让匿名类型转义它们所使用的方法。如果您需要在查询所在的方法之外传递信息,那么您在创建时所做的是正确的一个专门的类,然后返回一个序列。

请注意,在方法之外传递匿名类型有一些合理的用法(通过返回类型的对象,或者这些类型的序列的其他基类),但对于这样的情况,它不是其中之一。

答案 1 :(得分:1)

第一个选项将返回一个匿名类型,它不能是方法的返回类型,第二个方法是保存信息的具体类,因此类型是已知的,因此可以返回。

我还建议退回IEnumerable<MyReturnClass>,除非你需要它作为一个列表(阅读:你希望添加更多项目)

答案 2 :(得分:0)

通常,您希望将其分配给'var'类型,但这仅适用于局部变量。 '对象'可能???但这是一个远景