我有一个类似于以下内容的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相同则记住最后一个值。但有更好的方法吗?我可以在创建匿名类型时创建临时变量吗?
答案 0 :(得分:11)
使用let
关键字,如下所示:
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
:
var entities = table.AsEnumerable()
.Select(row => {
var tmp = GetObjectByProcessingID(row.ID);
return new {
ID = row.ID,
X = tmp[0],
Y = tmp[1],
....
};
});