我刚刚开始使用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查询中,返回类型应该是什么?
答案 0 :(得分:1)
使用以下语法时:
select new { Tag = ..., Count = ... };
您正在创建anonymous type。编译器会在编译时为您生成此类型的名称,因此您无法知道它是什么。
当您在选择此匿名类型的实例的查询上调用ToList时,您可能会返回列表,因为List实现了一些非泛型类(显然不依赖于类型参数T,您不是你知道吗,你可以施展。
一般情况下,您不应该让匿名类型转义它们所使用的方法。如果您需要在查询所在的方法之外传递信息,那么您在创建时所做的是正确的一个专门的类,然后返回一个序列。
请注意,在方法之外传递匿名类型有一些合理的用法(通过返回类型的对象,或者这些类型的序列的其他基类),但对于这样的情况,它不是其中之一。
答案 1 :(得分:1)
第一个选项将返回一个匿名类型,它不能是方法的返回类型,第二个方法是保存信息的具体类,因此类型是已知的,因此可以返回。
我还建议退回IEnumerable<MyReturnClass>
,除非你需要它作为一个列表(阅读:你希望添加更多项目)
答案 2 :(得分:0)
通常,您希望将其分配给'var'类型,但这仅适用于局部变量。 '对象'可能???但这是一个远景