我有以下伪造的代码,但想法是返回一个泛型类
public static var getSeaOf(string user)
{
var periodsSettings = from p in sea
where p.add_by == new Guid(user)
select new { p.id, p.name };
return var;
}
我在这里读过 - How to return anonymous type from c# method that uses LINQ to SQL,这种情况的最佳解决方案是为返回类型创建一个类。
但我的问题是,如果我有数百个这样的函数,这是否意味着我需要有数百个类?
我希望有一个更通用的解决方案,谢谢你的帮助!!
版
我看看
Silverlight - LinqToEntities - How Do I Return Anonymous Types
但我不能在select new中指定类名,就像文章那样?
public static IEnumerable<retSea> getBskSeasonsOf(string user)
{
var periodsSettings = from p in sea
where p.add_by == new Guid(user)
select new retSea { p.id, p.name };
return periodsSettings;
}
答案 0 :(得分:3)
如果我没记错的话,规范说明为该对象生成的匿名类型无法转义它定义的方法。因此,唯一可以拥有该类型变量的方法是实例化对象的方法。当你考虑到LINQ查询可以编译成一堆方法的事实时,有点粗略,但这是神奇的。
然而,对象本身可以逃避该方法。这项工作的方法是......返回object
。您必须使用反射(或dynamic
)访问它,因此您将失去类型安全性。您可能想要考虑这是否值得。最有可能的不是。而且很可能你没有数百种不同类型的结果 - 我敢打赌你的许多查询会返回相同类型的数据。重用这些课程。
答案 1 :(得分:3)
如果你真的有数百个课程,那就去上课吧。或者使用已经为密钥值对构建的内容,例如KeyValuePair。
答案 2 :(得分:2)
如果这些方法中的每一个都返回一个与其他方法具有相同字段的匿名类型,那么您只需创建一个类并在整个方法中重复使用它。
如果他们每个都返回一个具有不同字段的匿名类型,那么是的,你必须为每个方法创建一个类。
如果你正在使用C#4.0,你可以尝试利用the dynamic type,看看你可以在那里遇到什么样的麻烦。
答案 3 :(得分:2)
这是一篇关于使用VS 2010的Generate From Usage功能命名.NET中的匿名类型的博客文章。
http://diditwith.net/2009/10/24/NamingAnonymousTypesWithGenerateFromUsage.aspx
答案 4 :(得分:0)
好吧,您可能想要返回periodsSettings
。
但是,在此之后,请考虑在此方法中使用ToDictionary()
枚举该集合,其中键为p.id
,值为p.name
。
public static IDictionary<int, string> getSeaOf(string user) {
return (from p in sea
where p.add_by == new Guid(user))
.ToDictionary(p => p.id, p => p.name);
}
这有效地为您提供数据,而无需创建新课程。当然,它在这里列举了它,但在你的情况下这可能无关紧要。