linq更改结果集的值

时间:2017-04-19 19:29:56

标签: c# linq

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;
    }    
}

错误说:

  

&#34;属性或索引器&#39;匿名类型:DateTime? DatetimeCreated,   十进制UniqueIdNo,字符串RmaNumber,十进制? RmaOriginalUniqueId,   decimal ItemSequenceNo,string ItemNumber,bool good&gt; .good&#39;不可能是   分配给 - 它是只读的&#34;

我是否需要更改LINQ或我的foreach

2 个答案:

答案 0 :(得分:3)

最简单的方法是从以下位置更改匿名对象:

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调用之前检查值是一个很好的习惯。

答案 1 :(得分:0)

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

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

public class DataModel
{

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

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

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

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