在select中使用可空属性时的LINQ性能

时间:2013-02-15 10:01:13

标签: performance linq linq-to-entities

我有一个IEnumerable集合。 使用LINQ,我从Web服务响应中填充集合。 以下是我正在使用的样本。

lookupData = from data in content["data"].Children()
             select new LookupData
             {
                 LookupKey = (data["data"]["key"]).ToString(),
                 LookupValue = (string)data["data"]["name"]
             };

我将使用相同的代码进行许多类似的响应,这些响应将返回一个键和值。

现在,我得到了一个场景,当我需要来自服务响应的附加字段时,很少有响应(不是全部)。所以,我在“LookUpData”类中创建了一个“Optional”属性,如下所示:

lookupData = from data in content["data"].Children()
             select new LookupData
             {
                 LookupKey = (data["data"]["key"]).ToString(),
                 LookupValue = (string)data["data"]["name"],
                 Optional = referenceConfig.Optional != null 
                            ? (data["data"]["optional"]).ToString()
                            : String.Empty
             };

此处的空检查是性能问题。我不想使用下面的内容,因为我有其他条件,所有这些都将成为一个非常大的if else循环。

if(referenceConfig.Optional != null){

       lookupData = from data in content["data"].Children()
                     select new LookupData
                     {
                         LookupKey = (data["data"]["key"]).ToString(),
                         LookupValue = (string)data["data"]["name"],
                         Optional = (data["data"]["optional"]).ToString()
                     };
}
else{
       lookupData = from data in content["data"].Children()
                     select new LookupData
                     {
                         LookupKey = (data["data"]["key"]).ToString(),
                         LookupValue = (string)data["data"]["name"]
                     };
}

但我至少有10个Web服务器响应,每个响应中包含大量数据。

1 个答案:

答案 0 :(得分:0)

如果referenceConfig.Optional的值在编译时可用,则可以执行

    #if OPTIONAL

    ...

    #else

    ...

如果没有 - 你可以实现Null Object Pattern,即你的所有["data"][...]属性总是返回一个值(例如string.Empty,如果类型是字符串),所以你不会明确检查在代码中。