2017-04-19 36 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(); 

現在,你應該能夠向下修改集合中的代碼。