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

时间:2009-07-01 18:03:53

标签: c# linq linq-to-sql anonymous-types

  

可能重复:
  LINQ to SQL: Return anonymous type?

我有一个标准的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 };
    }

6 个答案:

答案 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个选项

  1. 让方法的返回类型为System.Object。然后你可以做邪恶的投射黑客来获得另一种方法中的类型值。这非常脆弱,我不推荐它。
  2. 使用泛型方法和类型推理技巧来获取正确的返回类型。这将需要一个非常有趣的签名定义为您的方法。
  3. 匿名类型并不是真正意味着以这种方式传递。在您需要以这种方式在函数之间传递它们时,最好明确定义类型。

答案 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。是的,你在施法时会有一些开销,但至少你会减少你扔掉物体。