如何从方法返回匿名类型?

Posted

技术标签:

【中文标题】如何从方法返回匿名类型?【英文标题】:How can I return an anonymous type from a method? 【发布时间】:2010-09-08 11:30:23 【问题描述】:

我有一个想要从多个地方调用的 Linq 查询:

var myData = from a in db.MyTable
             where a.MyValue == "A"
             select new  
                            a.Key,
                            a.MyValue
                          ;

如何创建一个方法,将这段代码放入其中,然后调用它?

public  ???  GetSomeData()

   // my Linq query

【问题讨论】:

你为什么不返回Diction 这只是一个简单的例子。我实际上选择了更多不适合字典的值 Return anonymous type? 的可能重复项 【参考方案1】:

IQueryable 和 IEnumerable 都可以工作。但是您想使用特定类型的版本,IQueryable<T> 或 IEnumerable <T>

所以你需要创建一个类型来保存数据。

var myData = from a in db.MyTable
             where a.MyValue == "A"
             select new MyType
             
                 Key = a.Key,
                 Value = a.MyValue
             ;

【讨论】:

非常感谢您扩展此解决方案。关键是使用特定类型。这很好用 嘿,我在 Darren 之前 1 小时给出了这个答案。为我提供不提供样品的权利:) 要清楚,发生的事情是 select new ... 创建了一个匿名类型(需要使用 var 关键字)。此类型没有名称,只能在创建它的方法中本地使用(除非您使用反射)。要在外部使用它,您需要创建一个命名类型。【参考方案2】:

IQueryable

所以你的方法声明看起来像

public IQueryable GetSomeData()

【讨论】:

这样做你不会有智能感知,只能通过反射访问项目的属性。 请注意查询尚未运行。 是的,我刚刚注意到这一点..我没有智能感知。一定有更好的办法。 这取决于你对更好方式的定义。延迟加载在许多情况下都很好。【参考方案3】:

一个通用的方法应该给你智能感知:

public class MyType Keyget;set; Valueget;set

public IQueryable<T> GetSomeData<T>() where T : MyType, new() 
  return from a in db.MyTable
          where a.MyValue == "A" 
          select new T Key=a.Key,Value=a.MyValue;
 

【讨论】:

【参考方案4】:

如果你想返回,你需要一个类型。

使用IEnumerable&lt;&gt; 声明并返回该变量,而不是var。遍历它实际上会执行查询。

【讨论】:

以上是关于如何从方法返回匿名类型?的主要内容,如果未能解决你的问题,请参考以下文章

从函数返回匿名类型

如何使用匿名方法返回值?

从 MVC 4 Web Api 返回匿名类型失败并出现序列化错误

Entity Framework 6 Recipes 2nd Edition(11-5)译 -> 从”模型定义”函数返回一个匿名类型

在 C# 中返回匿名类型

从转换为void返回委托的匿名函数返回