C# 此聚合查询应使用什么类型?

C# 此聚合查询应使用什么类型?,c#,linq,linq-to-sql,return-value,C#,Linq,Linq To Sql,Return Value,我刚刚接触到LINQ to SQL,在实现一个简单场景时需要一些建议: 我有一个方法ListTagCounts,它使用LINQ To SQL进行聚合查询。我不确定要使用的返回类型,因此使用了ToList()方法,并仅为返回类型创建了一个类,以便对其进行编译 模式: Link LinkTag Tag ---------- ---------- ---------- LinkID LinkID TagID URL TagID

我刚刚接触到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; }
}
代码:

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 MyReturnClass() { Tag = t.Name, Count = t.LinkTags.Count() }

在我的LINQ查询中,当使用以下语法时,返回类型应该是什么?

select new { Tag = ..., Count = ... };
您正在创建一个。编译器在编译时为您生成此类型的名称,因此您无法知道它是什么

当您在选择此匿名类型实例的查询上调用ToList时,可能会返回该列表,因为list实现了一些可以强制转换的非泛型类(显然不依赖类型参数t,您不知道)

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


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

通常,您希望将其指定给“var”类型,但这只适用于局部变量。”反对“也许?”???但是这是一个长字符串

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


我还建议返回
IEnumerable
,除非您需要它成为一个列表(阅读:您希望向其中添加更多项)

或等待c#4并将其分配给dynamic:-D@David...please不要那样做…:D@casperOne,我是在和David说话,而不是为此使用
动态
。@Stan R:很公平,删除了评论。=)@casperOne+1对于一个比我更合理的解释,有时我太懒了。不,这是一个匿名类型,编译器会为它动态生成一个类定义,并给它一个随机名称,一个你无法知道的名称,这就是为什么你使用
var
我不清楚如何在查询中使用IEnumerable;执行此操作时,我无法创建抽象类或接口“System.Collections.Generic.IEnumerable”@OrbMan:在这种情况下,您不使用匿名类型语法,而是使用
select new MyReturnClass(){Tag=…,Count=…}
作为select子句。