我有一个标准的LINQ to 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 };
}
答案 0 :(得分:65)
将匿名类型转换为类...
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
}
答案 1 :(得分:19)
您不能在C#中键入任何方法作为匿名类型的显式类型。它们不能被“命名”,因此不能出现在元数据签名中。
如果你真的想要返回一个匿名类型的值,那么有2个选项
匿名类型并不是真正意味着以这种方式传递。在您需要以这种方式在函数之间传递它们时,最好明确定义类型。
答案 2 :(得分:6)
使用var不会使其成为匿名类型。使用var只意味着让这个变量属于赋值右侧可用的类型。这只是空手而已。如果右侧的东西是真正的类,则该变量将属于该类型。
例如:
var person = new Person { Name = "bob" };
person变量的类型为Person,即使它使用了var关键字。
使用新的{Name = ...}创建匿名类型。在这种情况下,它是一个新的匿名类。您可以分配给它的唯一事情是使用var(或object)定义的变量,因为没有现成的名称可供使用。
例如:
var person = new { Name = "bob" };
在这种情况下,person是在运行时定义的匿名类型。
通常,正如@Chalkey所说,如果要将结果传递回另一个方法,请使用命名类型,而不是匿名类型。
如果您被迫使用匿名类型,则必须将其作为Object
类型的对象传回,然后使用反射来获取它的属性。
答案 3 :(得分:5)
Jon Skeet撰写了一篇关于如何做到这一点的博客,其名称正确Horribly Grotty Hack。正如标题所示,你真的不应该寻找返回匿名类型的方法。相反,您应该创建一个可以返回的类型,因为这是实现此功能的正确方法。
因此,我建议您创建要返回的类型的具体定义,然后在查询中填充该类型以便返回它。
答案 4 :(得分:2)
这取决于调用代码将如何使用数据。
如果您正在进行简单的数据绑定,实际上并不关心类型(即您不必显式访问C#代码中的属性),您可以将结果作为IEnumberable传回。
在大多数数据绑定的情况下,无论如何,你都是通过魔术字符串按名称调用属性,所以确切的类型无论如何都无关紧要。
否则,您需要将匿名类型转换为命名类型。
答案 5 :(得分:0)
如果你必须在大型应用程序中传递结果,可以使用Dictionary。是的,你在施法时会有一些开销,但至少你会减少你扔掉物体。