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' 不能 分配给——它是只读的”
我是否需要更改我的LINQ
或foreach
?
【问题讨论】:
【参考方案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 更改结果集的值的主要内容,如果未能解决你的问题,请参考以下文章
使用asp.net mvc + linq to sql如何循环输入结果集