可能重复:
LINQ to SQL的:返回匿名类型?
我有一个标准的LINQ到SQL查询,该返回数据作为匿名类型(含有约6的各种数据类型的数据的列)。
我想使提供给程序的其他部分此返回的对象,或者通过将其返回到方法即打电话,或通过将其分配到包含方法的对象的属性。
我怎样才能做到这一点因为它是一个匿名类型(“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 };
}
使匿名类型为一类...
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#中键入任何方法是显式类型的匿名类型。 他们不能被“点名”可以这么说,因此不能出现在元数据签名。
如果你真的想返回的值是一个匿名类型有2个选项
- 有方法的返回类型是System.Object的。 然后,您可以助纣为虐铸造黑客获得的另一种方法的输入值。 这是很脆弱的,我不建议这样做。
- 使用泛型方法和类型推断的手段来得到的返回类型正确。 这将需要为你的方法一个非常有趣的签名定义。
匿名类型并没有真正意味着以这种方式被传来传去。 在你需要以这种方式你的函数之间传递他们周围的点,你最好明确定义类型。
使用VAR并不能使它匿名类型。 使用VAR只是意味着让这个变量的赋值的右侧可用的类型。 这只是短暂的手。 如果在右边的东西是真正的类,变量将是此类型。
例如:
var person = new Person { Name = "bob" };
该人士变量的类型的人,即使它使用了var关键字。
匿名类型是使用新的{名称= ...}创建。 在这种情况下,它是一个新的,匿名类。 你可以将其分配到的唯一的事情是用VAR(或对象)因为没有使用任何现有名称定义的变量。
例如:
var person = new { Name = "bob" };
在这种情况下,人是在运行时定义的匿名类型。
一般来说,@Chalkey说,如果你想通过结果反馈给另一种方法,使用名为类型,而不是匿名的。
如果你被迫使用匿名类型,你必须通过它背照式的目标Object
,然后使用反射来得到它的属性。
乔恩斯基特写了一篇关于如何做到这一点,这是非常正确题为博客可怕地难看哈克 。 正如标题所暗示的,你真的不应该想办法返回一个匿名类型。 相反,你应该建立,因为这是实现此功能的正确方法可以返回一个类型。
因此,我建议你创建要返回的类型的具体定义,然后填充,在查询要返回它。
它种取决于调用代码将如何使用这些数据。
如果你正在做简单的数据绑定,真的不关心类型(即你没有在你的C#代码来显式访问属性),你可以将结果传递回为IEnumberable。
在大多数情况下,数据绑定您呼叫的名称的属性,通过神奇的字符串,无论如何,所以确切的类型不怎样都无所谓。
否则,您需要将匿名类型转换为命名类型。
如果你必须通过周围产生一个大的应用程序,你可以使用字典。 是的,你有一些开销铸造时,但至少你减少你扔掉的对象。
文章来源: How to return anonymous type from c# method that uses LINQ to SQL [duplicate]