在Linq中只调用一次常用方法

时间:2014-07-02 03:11:47

标签: c# asp.net asp.net-mvc linq

我在ASP.net MVC应用程序中存在代码,它返回我的设备数量,如下所示:

        return (from device in mynetwork.Devices where Helper.IsDevAvailable(device.id) != true
                select new DeviceInfo
                {
                    id = device.DeviceId,
                    name = BuildDeviceName(device),
                    make = Helper.GetListValue(device.List).Contains('_') ? (Helper.GetListValue(device.List).Split('_')[1] == Type.Unknown.ToString() ? "NA" : Helper.GetListValue(device.List).Split('_')[1]) : "NA"
                }).Count();

这里,GetListValue是一个函数,由于它在上面代码中的写入方式而被多次调用。

我是.NET&的新手想知道是否有办法只调用一次这个GetListValue&以某种方式修改上面的代码以提高性能和从而避免在C#中对此函数进行不必要的多次调用?

3 个答案:

答案 0 :(得分:2)

您可以使用let关键字

return (from device in mynetwork.Devices
        where Helper.IsDevAvailable(device.id) != true
        let listValue = Helper.GetListValue(device.List)
        ^^^^^^^^^^^^^
        select new DeviceInfo
            {
                id = device.DeviceId,
                name = BuildDeviceName(device),
                make = listValue.Contains('_') ? (listValue.Split('_')[1] == Type.Unknown.ToString() ? "NA" : listValue.Split('_')[1]) : "NA"
            }).Count();

答案 1 :(得分:2)

这已经得到了回答,但是在不使用let关键字的情况下链接语法也是如此。

我想把它扔到那里只是为了告诉你如何在你使用链式linq调用时“只允许使用linq查询语法”。

        mynetwork.Devices.Where(device => !Helper.IsDevAvailable(device)).Select(device =>
        {
            var listValue = Helper.GetListValue(device.List);
            return new DeviceInfo()
            {
                id = device.deviceId,
                name = BuildDeviceName(device),
                make = listValue.Contains('_') ? (listValue.Split('_')[1] == Type.Unknown.ToString() ? "NA" : listValue.Split('_')[1]) : "NA"
            };
        }).Count();

答案 2 :(得分:1)

尝试let clause

from xxx
let tempValue = Helper.GetListValue(device.List)
select xxx