【问题标题】:Casting after using linq to DataSet使用 linq 到 DataSet 后进行转换
【发布时间】:2012-04-26 22:17:09
【问题描述】:

我做了以下 linq 查询

var results = from myRow in QCAllDataSet.DataTable1.AsEnumerable()
                                      where myRow.Field<String>("ESRNumber") == value
                                      select new ESR(myRow.ESRNumber,
                                                           myRow.CreationDate,
                                                           myRow.Subsystem,
                                                           myRow.Name,
                                                           myRow.Product,
                                                           myRow.Version,
                                                           myRow.ESRStatus,
                                                           myRow.Owner,
                                                           myRow.Priority,
                                                           myRow.LastPHNote,
                                                           myRow.LastPHNoteDate,
                                                           myRow.LastPHNoteUser,
                                                           myRow.DaysFromLastUpdate,
                                                           myRow.Customer,
                                                           myRow.T2Owner,
                                                           myRow.T2Group,
                                                           myRow.comment,
                                                           myRow.ESRAge);

我想将results 转换为ESR 对象

somthig 喜欢ESR t=(ESR)results

但我收到以下错误:

无法将类型 'System.Data.EnumerableRowCollection 转换为 ESR

我应该怎么做这个?

【问题讨论】:

    标签: c# linq casting dataset


    【解决方案1】:

    当您使用 LINQ select 时,您将返回一个集合,即使您打算只检索一个结果。要指示单个结果,请使用Single() LINQ 方法:

    ESR t = results.Single();
    

    如果它可能不返回任何结果(不匹配),那么您可以使用SingleOrDefault() 并检查是否为空:

    ESR t = results.SingleOrDefault();
    if (t == null)
        // could not find match
    

    【讨论】:

      【解决方案2】:

      使用FirstOrDefault 从结果中只获取一项。

      var esrObject=  (from myRow in QCAllDataSet.DataTable1.AsEnumerable()
       where myRow.Field<String>("ESRNumber") == value
        select new ESR(myRow.ESRNumber,
                        myRow.CreationDate,
                        myRow.Subsystem)).FirstOrDefault();
      

      当您确定您的集合将只返回一条记录时,您可以使用SingleOrDefault,否则使用 FirstOrDefault。 FirstOrDefault 将返回序列的第一个元素,如果序列不包含任何元素,则返回默认值。因此,即使您的集合表达式返回多行,您也不必担心。

      【讨论】:

        【解决方案3】:

        Enumerable&lt;T&gt; 不是单个对象,即使它只包含一个对象。你必须指定你想要什么。有很多extension methods in Enumerable 喜欢:

        例如:

        List<ESR> allESR = results.ToList();
        ESR firstESR = results.First(); // throws an exception if there is not at least one
        ESR firstESR = results.FirstOrDefault(); // returns null if there's not at least one
        

        注意在调用这些方法之一之前不会执行查询(或者由于 LINQ 的 deferred execution 而使用 foreach to iterate them)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-20
          • 1970-01-01
          • 2011-03-13
          相关资源
          最近更新 更多