linq 更改结果集的值

Posted

技术标签:

【中文标题】linq 更改结果集的值【英文标题】:linq change the value of a result set 【发布时间】: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

【问题讨论】:

【参考方案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? 不管你用什么名字,我只是习惯于明确命名。 感谢您添加“包含...”的奖励 - 更清晰。 请注意,匿名类型强制您为字段命名,如果该值是简单字段引用,则它使用相同的字段名称。在创建类型时,我认为没有充分的理由创建新名称或重复名称。

以上是关于linq 更改结果集的值的主要内容,如果未能解决你的问题,请参考以下文章

函数中的LINQ查询,该函数使用param来更改结果集

使用asp.net mvc + linq to sql如何循环输入结果集

在 Drupal 7 中更改数据集的搜索查询条件

实体框架 - 具有多个结果集的存储过程 - 没有行返回

JDBC课程5--利用反射及JDBC元数据(ResultSetMetaData)编写通用的查询方法

格式化 LINQ 查询结果集