2014-07-27 41 views
0

我有如下表(数据表):DataTable的LINQ加入C#

CallData表有场StrikeMidPricePutData表的字段StrikeMidprice我想加入他们Strike,选择最低的下列表达式:

Abs(CallData.MidPrice - PutData.MidPrice) 

下面是我应该在LINQ条款中看到的图像:

var result = (from CallRow in CallData.AsEnumerable() 
       join PutRow in PutData.AsEnumerable() 
       on CallRow.Field<int>("Strike") equals PutRow.Field<int>("Strike") 
      select new { Abs(CallRow.Field<double>("MidPrice") 
          - PutRow.Field<double>("MidPrice")) 
         }).Min(); 

然而,表达

Abs(CallRow.Field<double>("MidPrice") 

由波浪线下划线且该消息说:

无效匿名型部件声明。匿名类型成员必须声明为成员 指定简单名称或成员访问权限。

任何想法如何纠正它?

编辑:伟大的答案Selman22!我发现在link

static void GetNameAndDescription {ProductInfo[] products} 
{ 
Console.WriteLine("Names and Descriptions:") 
var nameDesc = from p in product select new {p.Name, p.Description}; 
} 

下面的例子,你知道为什么这个代码是有效的“新”

回答

4

你甚至都不需要在这里匿名类型。只是删除new部分

var result = (from CallRow in CallData.AsEnumerable() 
      join PutRow in PutData.AsEnumerable() 
      on CallRow.Field<int>("Strike") equals PutRow.Field<int>("Strike") 
      select Abs(CallRow.Field<double>("MidPrice") 
        - PutRow.Field<double>("MidPrice"))).Min(); 

错误信息解释清楚的原因:

匿名类型成员必须与成员分配简单名称或成员访问来声明。

在这种情况下,您有一个复杂的表达式,所以您需要将该值设置为属性以使其工作。像new { value = Abs(...) },但正如我所说,你已经不需要它了......

+0

非常感谢!一个简单的问题。在[link](http://www.amazon.com/C-NET-Platform-Andrew-Troelsen/dp/1893115593)中有以下例子:'' – user1700890