我想从数据行中选择一些字段,例如:
var result = datatable.AsEnumerable()
.Select(x => new { x.Field<string>("Field1"), x.Field<string>("Field2")});
不幸的是,这不能说:
无效的匿名类型成员声明符。必须使用成员分配,简单名称或成员访问声明匿名类型成员。
我怎样才能实现我想要的目标?
编辑:因为看起来(至少)有两种方法可以实现它:
姓名:
var result = datatable.AsEnumerable().Select(x => new { Field1 = x.Field("Field1"), Field2 = x.Field("Field2") });
创建新对象
假设我们有一个班级
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")));
答案 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")));
然后,您可以分别使用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")));
答案 2 :(得分:1)
嗯,错误说明了一切,给成员们命名:
var result = datatable.AsEnumerable()
.Select(x => new {
First = x.Field<string>("Field1"),
Second = x.Field<string>("Field2")
});