如何在使用Linq时返回匿名类型

可能重复:
LINQ to SQL:返回匿名类型?

任何人都知道如何返回匿名类型。 我正在使用Linq,我需要返回以下代码

private  SampleLinq(Int32 Num) { var query = (from dept in obj.DeptTable where dept.Id == Num select new { dept.DeptName, dept.DeptId }); return (query) } 

不好意思说但是你不能回复匿名类型方法的范围。

这是获得anonmous类型的另一种方法

 // Method that returns anonymous type as object object ReturnAnonymous() { return new { City="Prague", Name="Tomas" }; } // Application entry-point void Main() { // Get instance of anonymous type with 'City' and 'Name' properties object o = ReturnAnonymous(); // This call to 'Cast' method converts first parameter (object) to the // same type as the type of second parameter - which is in this case // anonymous type with 'City' and 'Name' properties var typed = Cast(o, new { City="", Name="" }); Console.WriteLine("Name={0}, City={1}", typed.Name, typed.City); } // Cast method - thanks to type inference when calling methods it // is possible to cast object to type without knowing the type name T Cast(object obj, T type) { return (T)obj; } 

您只能将它用于一个程序集中的类型(两个不同程序集中的两个匿名类型将在内部编译为两个不能使用此技巧转换的不同类型)。

返回动态类型:

  public static dynamic getCustomer() { ..... var x = from c in customers select new {Fname = c.FirstName}; return x; } static void Main(string[] args) { dynamic x = getCustomer(); Console.WriteLine(Enumerable.First(x).Fname); Console.ReadKey(); } 

你不能这样做。 这就是为什么它被称为匿名。 它没有名字。 但是你总是可以将它投射到object

嗯,你实际上不能这样做,但这是一个黑客 。

 private object SampleLinq(Int32 Num) { return (from dept in obj.DeptTable where dept.Id == Num select new { dept.DeptName, dept.DeptId }); } 

您无法从方法返回匿名类型。

您可以创建一个简单的类来包装匿名类型,但您仍然需要一个类(或转换为object )。

但请记住,如果你施放到object那里就没有办法反击。 您需要reflection才能读取任何数据。

你从黑客中看到的答案是通过方法边界获得匿名类型的很多工作。 你不应该这样做。 如果需要从方法中传回某些内容,则应该传递具体类型。

这取决于你对返回谷的看法。

  • 如果你要在UI中绑定它,你可以重新运行IEnumerableIQueryable

  • 如果你要在返回值上使用reflection只返回类型对象

  • 如果您使用c#4.0,则可以返回动态类型

  • 如果您使用EFLinq to SQL进一步加入由匿名类型组成的查询,则可以改为使用具体的占位符技术。 有关此技术的更多详细信息,我可以提供一些帮助。

正如其他人所提到的那样,你应该真正质疑返回一个匿名类型forms的方法是解决手头问题的最佳方法。 通常,通常存在更好的基于模式的方法,其可能需要在前面进行更多编码,但可能导致更优雅的设计。 话虽如此,我确实认为存在合法的情况,例如数据绑定,其中返回的匿名类型实例是完全可以接受的。

更新 :只是一个感兴趣的小故事我想分享,以防那些阅读不知道。 匿名类型对于它们的属性名称和类型是唯一的,因此假设您在方法A和方法B中都创建了一个匿名类型,它具有一个名为Name的单字符串类型属性,通过执行类似下面的代码。

 public object A() { return new { Name = "Cid" } } public object B() { return new { Name = "Galuf" } } public void Test() { System.Diagnostics.Trace.Assert(A().GetType() == B().GetType()); } 

现在,即使此类型在两个单独的位置定义,编译器仅创建仅创建单个共享类型,因为它们都具有由属性类型和属性名称定义的相同属性集。 在这方面,属性可以被认为是匿名类型的一种签名。 使用这些知识,有不同的技术可用于内省到使用dynamic关键字强制转换为对象或延迟的匿名类型实例。 正如Linq对静态Enumerable和Queryable类中的方法所做的那样,使用generics方法也可以使用匿名类型。 这样,您可以执行诸如创建任何给定匿名类型的新实例而不使用reflection的操作。 诀窍是,您必须使用匿名类型的实例传递给方法,以便通用方法推断出类型。 如果有人对这些主题感兴趣,因为它们适用于原始海报问题,请发表评论,我可以尝试澄清其中的一些技巧。