【问题标题】:LINQ performance when using nullable properties in select在选择中使用可为空属性时的 LINQ 性能
【发布时间】:2013-02-15 10:01:13
【问题描述】:

我有一个 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 服务器响应,每个响应中有大量数据。

【问题讨论】:

  • content["data"].Children()的类型是什么?如果“可选”不存在,索引器data["data"]["optional"] 是否会抛出异常?
  • The null check here is a performance issue. 认真的吗?如果有,影响有多大?为什么?

标签: performance linq linq-to-entities


【解决方案1】:

如果referenceConfig.Optional 的值在编译时可用,您可以这样做

    #if OPTIONAL

    ...

    #else

    ...

如果不是 - 您可以实现 Null Object Pattern 即让您的所有 ["data"][...] 属性始终返回一个值(例如 string.Empty 如果类型是字符串),因此您不会在代码中显式检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-27
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多