【问题标题】: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? 的可能重复项

标签: c# linq data-structures parameter-passing


【解决方案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 {Key{get;set;} Value{get;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。遍历它实际上会执行查询。

    【讨论】:

      猜你喜欢
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      相关资源
      最近更新 更多