Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从使用LINQ到SQL的c方法返回匿名类型_C#_Linq_Linq To Sql_Anonymous Types - Fatal编程技术网

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

C# 如何从使用LINQ到SQL的c方法返回匿名类型,c#,linq,linq-to-sql,anonymous-types,C#,Linq,Linq To Sql,Anonymous Types,可能重复: 我有一个标准的LINQtoSQL查询,它以匿名类型返回数据,包含大约6列不同数据类型的数据 我想让这个返回的对象对程序的其他部分可用,方法是将其返回给方法调用方,或者将其分配给包含方法的对象的属性 如果它是一个匿名类型var,我该如何做呢 编辑-以下是代码: using (ormDataContext context = new ormDataContext(connStr)) { var electionInfo = from t1 in cont

可能重复:

我有一个标准的LINQtoSQL查询,它以匿名类型返回数据,包含大约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中键入任何方法作为匿名类型的显式类型。可以说,它们不能命名,因此不能出现在元数据签名中

如果您真的想返回一个匿名类型的值,有两个选项

方法的返回类型为System.Object。然后,您可以进行邪恶的强制转换,以在另一个方法中获得类型化值。这是非常脆弱的,我不推荐它。 使用泛型方法和类型推断技巧来获得正确的返回类型。对于您的方法,这需要一个非常有趣的签名定义。
匿名类型并不是真的要以这种方式传递的。当您需要以这种方式在函数之间传递它们时,最好显式定义一个类型。

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


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

使用var不会使其成为匿名类型。使用var仅仅意味着让这个变量属于赋值右边可用的类型。这只是速记。如果右侧的对象是实类,则变量将是该类型

例如:

var person = new Person { Name = "bob" };
var person = new { Name = "bob" };
person变量的类型为person,即使它使用了var关键字

匿名类型是使用新的{Name=…}创建的。在本例中,它是一个新的匿名类。唯一可以指定给它的是使用var或object定义的变量,因为没有可用的现有名称

例如:

var person = new Person { Name = "bob" };
var person = new { Name = "bob" };
在本例中,person是在运行时定义的匿名类型

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


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

如果您必须在大型应用程序中传递结果,则可以使用Dictionary。是的,你在施放时有一些开销,但至少你减少了你扔掉的东西

这在某种程度上取决于调用代码将如何使用数据

如果您正在进行简单的数据绑定,那么您实际上并不关心类型,也就是说,您不必显式地访问C代码中的属性,您可以将结果作为IEnumberable传回

在大多数数据绑定情况下,您都是通过名称、魔术字符串调用属性,因此确切的类型并不重要


否则,您需要将匿名类型转换为命名类型。

+1我刚刚发布了一个类似这样的答案,请告诉我:讨厌这种事发生好的,你基本上是说不要使用匿名类…我同意这看起来更清楚。我想我想知道为什么大多数LINQ示例都使用var,如果它们很难使用…@NagaMensch-您仍然可以使用var关键字而不创建匿名类型。在上面的例子中,它将是var p=来自个人。。。选择new Person{…},您仍然会得到一个Person对象而不是一个匿名类型。它需要是Person对象的列表吗?假设数据不止一行…渴望记住经典ASP中的recordset对象…这似乎是代码复杂性和性能之间的折衷…对于一个小程序来说没什么大不了的,但是在一个有数百个db调用的大型项目中,为检索到的每个数据集创建一个自定义对象,如果DB改变,必须改变它们,听起来像是一种痛苦和代码复杂度的增加……然后,你应该考虑你是否正在使用正确的技术来做你正在做的工作。当你需要的是锤子时,不要使用铲子。那么,我怎么可以有一个记录集类型对象,即将所有返回的类型存储在一个标准的.NET对象中,这些对象可以很容易地移动?我希望你需要考虑有一个已知的基类和一些键值对字典。但是您示例中新命名的变量Person在intellis中不确定
ense作为方法的可用返回类型…您需要为我发布方法的代码,以便提供更多建议。Thx,我只是在问题中添加了代码。@NagaMensch-我会按照@Chackey建议的路线,为连接创建一个单独的模型/类,而不是在这里使用匿名类型。暂时将此作为原始问题的线索。如果您认为这两个问题应该合并,请留下评论,我稍后会再查看。只是澄清一下,var不是匿名类型。var是一个速记关键字,只要编译器能够推断类型,就可以使用它。在本例中,electionInfo是匿名类型。在C7中,您可以使用元组。。。参考:使用动态数据类型在您需要在函数之间以这种方式传递它们时,最好显式定义一个类型^