【问题标题】:linq change the value of a result setlinq 更改结果集的值
【发布时间】:2017-09-16 04:50:09
【问题描述】:

C# - VS 2017 - LINQ to Entities 我需要提取一些数据,逐步检查每个项目,如果符合特定标准,则更改标志。

我知道这是因为匿名类型 - 我已经阅读了几篇关于它的帖子,但我不知道如何解决它。

我需要把好的从假变成真。 这是我获取数据的地方:

var RMA_stops_all = (from rma in rDb.DistributionStopInformations
                     join line in rDb.DistributionLineItems on rma.UniqueIdNo equals line.UniqueIdNo
                     where line.RmaNumber != null
                         && (line.DatetimeCreated > Convert.ToDateTime(dateToCheck_rma) 
                             && line.DatetimeCreated < Convert.ToDateTime(dateToCheck_rma).AddDays(7))
                         && rma.CustomerNo == TNGCustNo
                     select new
                     {
                         line.DatetimeCreated,
                         rma.UniqueIdNo,
                         line.RmaNumber,
                         line.RmaOriginalUniqueId,
                         line.ItemSequenceNo,
                         line.ItemNumber,
                         good = false
                     }).ToArray();

这里是我逐步浏览每个项目的地方:

foreach (var testRma in RMA_stops_all)
{
    if (testRma.RmaNumber.Contains("/078"))
    {
        testRma.good = true;
    }    
}

错误提示:

"属性或索引器'匿名类型:DateTime?DatetimeCreated, 十进制 UniqueIdNo,字符串 RmaNumber,十进制? RmaOriginalUniqueId, decimal ItemSequenceNo, string ItemNumber, bool good>.good' 不能 分配给——它是只读的”

我是否需要更改我的LINQforeach

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    匿名对象是只读的,一旦创建就不能修改。

    解决这个问题的方法是为此创建一个类,并在其中添加所需的属性,然后在 linq 查询中使用该类来填充该类型的集合。

    public class DataModel
    {
    
      public DateTime DatetimeCreated {get;set;}
      ........................
      ........................
      // other properties that are needed
    }
    

    然后在您的查询项目中使用该类:

    select new DataModel {
        DateTimeCreated = line.DatetimeCreated,
        .............
        .............
        // other properties
    }).ToArray();
    

    现在您应该可以在代码中修改集合了。

    【讨论】:

      【解决方案2】:

      最简单的方法是更改​​匿名对象:

      select new
      {
          line.DatetimeCreated,
          rma.UniqueIdNo,
          line.RmaNumber,
          line.RmaOriginalUniqueId,
          line.ItemSequenceNo,
          line.ItemNumber,
          good = false
      }
      

      到:

      select new
      {
          dtCreated = line.DatetimeCreated,
          uniqueID = rma.UniqueIdNo,
          rmaNumber = line.RmaNumber,
          origUniqueID = line.RmaOriginalUniqueId,
          itemSeqNo = line.ItemSequenceNo,
          item = line.ItemNumber,
          good = line.RmaNumber.Contains("/078")
      }
      

      我还命名了匿名对象中的所有变量,如果稍后在方法中需要,这将使访问它们更容易。在Contains 调用之前对值进行空值检查是一个好习惯,以防万一,尽管我看到您在初始查询中这样做了。

      【讨论】:

      • 应该没问题,尽管就像我说的那样,您在查询中使用了过滤器where line.RmaNumber != null,所以无论如何都不会得到空值。你可以忽略那部分。
      • 谢谢...再澄清一下——我使用当前字段名称有什么问题——IE:UniqueIdNo = rma.UniqueIdNo vs uniqueID 和 RmaNumber vs rmaNumber?
      • 不管你用什么名字,我只是习惯于明确命名。
      • 感谢您添加“包含...”的奖励 - 更清晰。
      • 请注意,匿名类型强制您为字段命名,如果该值是简单字段引用,则它使用相同的字段名称。在创建类型时,我认为没有充分的理由创建新名称或重复名称。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      相关资源
      最近更新 更多