datarow-object的匿名类型无效

时间:2012-11-15 16:30:09

标签: c# linq .net-3.5 anonymous-types datarow

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

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

不幸的是,这不能说:

  

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

我怎样才能实现我想要的目标?

编辑:因为看起来(至少)有两种方法可以实现它:

  1. 姓名:

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

  3. 假设我们有一个班级

    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")));
    

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您需要为匿名类型的成员提供一些名称。

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

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


如果您希望返回Tuple而不是匿名类型,则可以

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

然后,您可以分别使用Item1Item2访问成员。

但是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")));

答案 2 :(得分:1)

嗯,错误说明了一切,给成员们命名:

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