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

alc*_*cal 44 c# linq anonymous-types linq-to-sql

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

我有一个标准的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 };
    }
Run Code Online (Sandbox Code Playgroud)

小智 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
    }
Run Code Online (Sandbox Code Playgroud)

  • 好吧,所以你基本上是说不要使用匿名课......我同意这看起来更清楚了.我想我想知道为什么大多数LINQ样本使用var,如果它们很难处理...... (3认同)
  • @NagaMensch - 您仍然可以使用var关键字而不创建匿名类型.在上面的例子中,它将是"var p = from person ... select new Person {...}",你仍然最终得到一个Person对象而不是一个匿名类型 (2认同)
  • 它需要是Person对象的List <>吗?(假设数据不止一行) (2认同)

Jar*_*Par 19

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

如果你真的想要返回一个匿名类型的值,有2个选项

  1. 该方法的返回类型是System.Object.然后你可以做邪恶的投射黑客来获得另一种方法中的类型值.这非常脆弱,我不推荐它.
  2. 使用泛型方法和类型推理技巧来获得正确的返回类型.这将需要一个非常有趣的签名定义为您的方法.

匿名类型并不是真正意味着以这种方式传递.在您需要以这种方式在函数之间传递它们时,最好明确定义类型.


tva*_*son 6

使用var不会使它成为匿名类型.使用var只意味着让这个变量属于赋值右侧的可用类型.这只是空手而已.如果右侧的东西是真正的类,则该变量将属于该类型.

例如:

var person = new Person { Name = "bob" };
Run Code Online (Sandbox Code Playgroud)

person变量的类型为Person,即使它使用了var关键字.

使用新的{Name = ...}创建匿名类型.在这种情况下,它是一个新的匿名类.您可以将其分配给的唯一内容是使用var(或object)定义的变量,因为没有可用的现有名称.

例如:

var person = new { Name = "bob" };
Run Code Online (Sandbox Code Playgroud)

在这种情况下,person是在运行时定义的匿名类型.

通常,正如@Chalkey所说,如果要将结果传递回另一个方法,请使用命名类型,而不是匿名类型.

如果您被迫使用匿名类型,则必须将其作为类型的对象传回Object,然后使用反射来获取它的属性.


Jef*_*tes 5

Jon Skeet写了一篇关于如何做到这一点的博客,这篇文章非常正确地名为Horribly Grotty Hack.正如标题所示,你真的不应该寻找返回匿名类型的方法.相反,您应该创建一个可以返回的类型,因为这是实现此功能的正确方法.

因此,我建议您创建要返回的类型的具体定义,然后在查询中填充该类型以便返回它.