匿名类型中的临时变量

Dav*_*vid 4 c# linq

我有一个类似于以下的linq语句:

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

是否可以做以下事情:

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

为了避免两次调用GetObjectByProcessingID?

我知道你可以这样做:

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

但在这种情况下,它将暴露整个数组.我也知道我可以在方法端实现缓存(GetObjectByProcessingID)或创建一个帮助方法来调用它,如果ID相同则记住最后一个值.但有更好的方法吗?我可以在创建匿名类型时创建临时变量吗?

Kin*_*ing 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],
                            ....
                           };
Run Code Online (Sandbox Code Playgroud)

您也可以尝试使用method syntax我最喜欢的:

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