2013-10-22 48 views
4

内临时变量我有类似下面这样的LINQ声明:匿名类型

 var entities = from row in table.AsEnumerable() 
            select new 
            { 
             ID = row.ID, 
             X = GetObjectByProcessingID(row.ID)[0], 
             Y = GetObjectByProcessingID(row.ID)[1], 
             .... 
            }; 

是否可以做这样的事情:

 var entities = from row in table.AsEnumerable() 
            select new 
            { 
             private var tmp = GetObjectByProcessingID(row.ID), 
             ID = row.ID, 
             X = tmp[0], 
             Y = tmp[1], 
             .... 
            }; 

为了避免调用GetObjectByProcessingID两次?

我知道你可以这样做:

 var entities = from row in table.AsEnumerable() 
            select new 
            { 
             ID = row.ID, 
             XAndY = GetObjectByProcessingID(row.ID), 
             .... 
            }; 

但在这种情况下,它会暴露整个阵列。我也知道,我可以在方法一侧(GetObjectByProcessingID)实现像缓存这样的东西,或者创建一个帮助器方法来调用它,并记住ID是否相同的最后一个值。但是有更好的方法吗?我可以在创建匿名类型时创建临时变量吗?

回答

11

使用let关键字如下:

var entities = table.AsEnumerable() 
        .Select(row => { 
         var tmp = GetObjectByProcessingID(row.ID); 
         return new { 
           ID = row.ID, 
           X = tmp[0], 
           Y = tmp[1], 
           .... 
           }; 
        }); 

var entities = from row in table.AsEnumerable() 
       let tmp = GetObjectByProcessingID(row.ID) 
       select new { 
          ID = row.ID, 
          X = tmp[0], 
          Y = tmp[1], 
          .... 
          }; 

您还可以使用method syntax这是非常喜欢我试试