0

我想从数据行中选择一些字段,例如:

var result = datatable.AsEnumerable()
    .Select(x => new { x.Field<string>("Field1"), x.Field<string>("Field2")});

不幸的是,这不起作用说:

无效的匿名类型成员声明符。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。

我怎样才能达到我想要的?

编辑:似乎(至少)有两种方法可以实现它:

  1. 给他们起名字:

    var 结果 = datatable.AsEnumerable().Select(x => new
    {
        Field1 = x.Field("Field1"),
        Field2 = x.Field("Field2")
    });
  2. 创建一个新对象

假设我们有一堂课

class MyClass
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }

    public MyClass(string field1, string field2)
    {
        this.Field1 = field1;
        this.Field2 = field2;
    }
}

我们可以做到以下几点:

var result = datatable.AsEnumerable()
    .Select(x => new MyClass(x.Field<string>("Field1"), x.Field<string>("Field2")));
4

3 回答 3

2

您需要为属性命名:

var result = datatable.AsEnumerable()
    .Select(x => new 
    { 
        Field1 = x.Field<string>("Field1"), 
        Field2 = x.Field<string>("Field2")
    });

然后使用它:

var field1 = result.First().Field1;

编译器不知道如何从x.Field<string>("Field1"). 但这会起作用:

int id = 1;
string name = "Myname";
var obj = new { id, name }; // Names are inferred from the variable name.

var result = obj.name; // This would work
于 2012-11-15T16:31:23.120 回答
2

你需要给你的匿名类型的成员一些名字。

var result = datatable.AsEnumerable()
    .Select(x => new { 
        Field1 = x.Field<string>("Field1"), 
        Field2 = x.Field<string>("Field2")});

如果您考虑一下,没有名称会使以后引用属性变得非常困难,您必须使用反射和一些猜测工作。在任何情况下,都需要定义名称,以便可以在幕后为您创建匿名类型。


如果您更喜欢返回 aTuple而不是匿名类型,您可以这样做

    var result = datatable.AsEnumerable()
    .Select(x => Tuple.Create( 
        Field1 = x.Field<string>("Field1"), 
        Field2 = x.Field<string>("Field2")));

然后您可以分别使用Item1和访问成员Item2

但是,该Tuple课程是 .Net 4.0 的新手,您的问题被标记为 3.5


作为对您的评论的回应,您始终可以声明自己的类型

public class MyPair<TItem1, TItem2>
{
    public MyPair(TItem1 item1, TItem2 item2)
    {
        this.Item1 = item1;
        this.Item2 = item2;
    }

    public TItem1 Item1 { get; private set; }
    public TItem2 Item2 { get; private set; }
}

显然你会这样使用,

var result = datatable.AsEnumerable()
    .Select(x => new MyPair( 
        Field1 = x.Field<string>("Field1"), 
        Field2 = x.Field<string>("Field2")));
于 2012-11-15T16:32:49.263 回答
1

好吧,错误说明了一切,给成员起名字:

var result = datatable.AsEnumerable()
.Select(x => new { 
                    First = x.Field<string>("Field1"),
                    Second = x.Field<string>("Field2")
                 });
于 2012-11-15T16:31:50.700 回答