2017-04-19 35 views
1

C# - VS 2017 - LINQ to Entities 我需要拉取一些数据,逐步通过每个项目,并且如果它符合某个标准,则更改一个标志。linq更改结果集的值

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

我需要改变从假到真。 这里就是我得到的数据:

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, decimal UniqueIdNo,string RmaNumber,decimal?RmaOriginalUniqueId, decimal ItemSequenceNo,string ItemNumber,bool good> .good'can not被 分配到 - 它是只读”

我需要改变我的LINQ还是我foreach

回答

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之前先检查值是个好习惯,尽管我在最初的查询中看到你这样做了。

+0

这应该没问题,但正如我所说的,您在查询中使用过滤器“where line.RmaNumber!= null”,因此无论如何都不会得到空值。你可以把这个部分留下。 –

+0

谢谢你...一个更多的澄清 - 任何问题与我使用当前字段名称 - IE:UniqueIdNo = rma.UniqueIdNo与uniqueID和RmaNumber与rmaNumber? –

+0

无论什么名字适合你,我只是习惯于明确地命名它们。 –

0

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

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

public class DataModel 
{ 

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

,然后使用这个类在你的查询项目:

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

现在,你应该能够向下修改集合中的代码。