【问题标题】:Converting windows forms application from .NET 3.5 to .NET 4将 Windows 窗体应用程序从 .NET 3.5 转换为 .NET 4
【发布时间】:2014-01-24 04:47:22
【问题描述】:

我已将 Windows 窗体应用程序从 .net 3.5 转换为 .net 4。我正在使用 Linq 处理数据。现在我对 Linq 有一些问题,因为在新版本中,它在尝试对空结果集进行查询时会引发异常。例如(resultSet 的类型是 System.Linq.IQueryable):

var orderedResult = from d in resultSet
                     orderby d.ID descending
                     select d;

resultSet 为 null 时抛出异常“Value can not be null”。它在 .NET 3.5 中运行良好。如何在 .NET 4 中避免此错误,使代码更改最少?有没有可以切换的设置,让resultSet值为null时,不做任何查询,不抛出异常?

问题是我有成千上万个类似上面的语句。如果我必须用“if resultsSet != null”检查它们中的每一个,这将是一个困难的解决方案。 在 .NET 3.5 版中,对空结果集的查询只是返回空值。我可以为 .NET 4 做同样的事情吗?

【问题讨论】:

  • 是的,有一个if语句来检查值是nullnot。在所有编程语言中都很常见。
  • " 在 .NET 3.5 版中,对 null 结果集的查询只是返回 null" - 这是不正确的。 .NET 3.5 上的 from d in (IQueryable<string>)null select d 也会抛出 ArgumentNullException 说“值不能为空”。您不只是将框架版本从 3.5 更改为 4,对吧?

标签: c# .net linq nul


【解决方案1】:

我很确定,如果 .NET 3.5 中的结果集是 null,它也会引发异常。 LINQ 是一组扩展方法的语法糖。当对象为null 时,扩展方法不可用。您应该评估 DAL 中的更改。例如,如果您使用的是 LINQ to SQL,则可能会有一些适用于您的更改:http://damieng.com/blog/2009/06/01/linq-to-sql-changes-in-net-40

【讨论】:

    【解决方案2】:
    if(resultSet != null)
    {
        //perform your action here
    }
    

    【讨论】:

    • 问题是我有成千上万的陈述,就像我第一篇文章中的陈述一样。如果我必须检查每个结果集!= null,这将是一个困难的解决方案。在 .NET 3.5 版中,对空结果集的查询只是返回空值。我可以为 .NET 4 做同样的事情吗?
    【解决方案3】:

    让我们在null上调用一个方法!

    public static IEnumerable<TEntity> EmptySetIfNull( this IEnumerable<TEntity> enumerable )
    {
        if( null == enumerable )
        {
            return new TEntity[] { };
        }
    
        return enumerable;
    } 
    

    用法:

    IEnumerable<ClassA> resultSet = null;
    
    var orderedResult = from d in resultSet.EmptySetIfNull()
                         orderby d.ID descending
                         select d;
    

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 2011-02-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多