如何从使用LINQ to SQL的c#方法返回匿名types

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

我有一个标准的LINQ to SQL查询,它以匿名types(包含大约6个不同数据types的数据列)的forms返回数据。

我想通过返回给方法调用者,或者将其赋值给包含该方法的对象的属性,使该返回的对象可用于程序的其他部分。

我怎么能这样做,因为它是一个匿名types(“var”)?

编辑 – 这是代码:

using (ormDataContext context = new ormDataContext(connStr)) { var electionInfo = from t1 in context.elections join t2 in context.election_status on t1.statusID equals t2.statusID select new { t1, t2 }; } 

使匿名types成为一个类…

 public class Person { public Person() { } public String Name { get; set; } public DateTime DOB { get; set; } } Person p = from person in db.People where person.Id = 1 select new Person { Name = person.Name, DOB = person.DateOfBirth } 

您不能在C#中键入任何方法作为匿名types的显式types。 它们不能被“命名”,因此不能出现在元数据签名中。

如果你真的想返回一个匿名types的值有2个选项

  1. 有方法的返回types是System.Object。 然后你就可以通过另一种方法进行邪恶的黑客攻击以得到一个types化的值。 这是非常脆弱的,我不推荐它。
  2. 使用generics方法和types推断技巧来获取正确的返回types。 这将需要一个非常有趣的签名定义你的方法。

匿名types并不是真正意味着以这种方式传递。 在这一点上,你需要通过这种方式在你的函数之间传递它们,你最好明确定义一个types。

使用var不会使其成为匿名types。 使用var只是意味着让这个variables成为赋值右边的可用types。 这只是简短的手。 如果右边的东西是一个真实的类,那么这个variables就是这个types的。

例如:

 var person = new Person { Name = "bob" }; 

personvariables是Persontypes的,尽pipe它使用了var关键字。

匿名types是使用新的{Name = …}创build的。 在这种情况下,这是一个新的匿名类。 您可以将它分配给的唯一一个variables是使用var(或object)定义的variables,因为没有现有名称可供使用。

例如:

 var person = new { Name = "bob" }; 

在这种情况下,person是运行时定义的匿名types。

一般来说,正如@Chalkey所说的,如果你想把结果传递回另一个方法,可以使用一个命名types,而不是匿名types。

如果您被迫使用匿名types,则必须将其作为Objecttypes的Object传回,然后使用reflection来获取其属性。

Jon Skeet写了一篇关于如何做到这一点的博客,这篇文章的名字叫做Horribly Grotty Hack 。 就像标题所暗示的那样,你真的不应该在寻找返回匿名types的方法。 相反,您应该创build一个可以返回的types,因为这是实现此function的正确方法。

因此,我build议您创build要返回的types的具体定义,然后在查询中填充它以返回。

它的种类取决于调用代码如何使用数据。

如果你正在做简单的数据绑定,真的不关心types(即你不必显式地访问C#代码中的属性),你可以将结果作为IEnumberable传递回去。

在大多数数据绑定的情况下,你是通过名字,通过魔术string调用属性,无论如何,所以确切的types无关紧要。

否则,您需要将匿名types转换为指定types。

如果您必须在大型应用程序中传递结果,则可以使用“字典”。 是的,当你投射的时候,你有一些开销,但至less你减less了你扔掉的东西。