c# - lambda 的 Linq 更新问题

标签 c# linq lambda

我正在尝试使用 lambda 在 Linq 中编写一些代码。这是我使用 lambda 的第一个代码,我在更新 Record 时遇到了问题。 我的代码是:

using (DataClasses1DataContext db = new DataClasses1DataContext())
{

    Table<NOTIF_RECIP> NOTIF_RECIP_alias = db.GetTable<NOTIF_RECIP>();
    Table<NOTIF_SCHED> NOTIF_SCHED_alias = db.GetTable<NOTIF_SCHED>();
    Table<mainframe_replication> mainframe_replication_alias = db.GetTable<mainframe_replication>();

    var ids = NOTIF_SCHED_alias.Select(x => x.NOTIF_RPT_ID).ToArray();


    foreach (string notif_sched_data in ids)
    {
        var repljoinmf = mainframe_replication_alias
                        .Join(NOTIF_RECIP_alias,
                             mfr => mfr.RPT_ID,
                             nr => nr.NOTIF_RECIP_ID,
                             (mfr, nr) => new
                             {
                                 ReportId=mfr.RPT_ID, 
                                 Reportversion=mfr.RPT_VERS,
                                 ReportBytes= mfr.RPT_BYTES.ToString(), 
                                 ReportDate=mfr.REPL_DTM.ToString(),
                                 NotifId= mfr.NOTIF_ID,
                                 RecipAdd=nr.NOTIF_RECIP_ADDR
                             });

        foreach(var repljoinmf_data in repljoinmf)
        {
            //DO STUFF 
            repljoinmf_data.NotifId = "Changedxyz";
            //db.SubmitChanges();
        }
    }
}

我在 repljoinmf_data.NotifId = "Changedxyz"; 中遇到错误 错误提示:错误 2 属性或索引器“AnonymousType#3.NotifId”无法分配给 -- 它是只读的

有人可以帮我解决这个问题吗?我认为这是因为我使用的是匿名的 var,但如何解决这个问题。感谢任何帮助。

谢谢

最佳答案

如错误所示,匿名类实例一旦被投影就无法修改。

虽然您可以切换到强类型类,然后重新分配成员属性,但是,您有机会将前面 LINQ 语句中的所需结果转换到同一个匿名类中:

var repljoinmf = mainframe_replication_alias
.Join(NOTIF_RECIP_alias, mfr => mfr.RPT_ID, nr => nr.NOTIF_RECIP_ID, 
(mfr, nr) => new // Anon Class projection
{ 
    ReportId=mfr.RPT_ID, 
    Reportversion=mfr.RPT_VERS,
    ReportBytes= mfr.RPT_BYTES.ToString(),     
    ReportDate=mfr.REPL_DTM.ToString(),
    NotifId= "Changedxyz", // *** No need to mutate this afterwards
    RecipAdd=nr.NOTIF_RECIP_ADDR 
});

编辑、更新不是微不足道的任务,建议的替代方案

选项 #1:强类型类在投影后具有突变

添加一个新类(我猜到了一些类型)

public class MyPoco
{
     public int ReportId {get; set;}
     public string Reportversion {get; set;}
     public byte[] ReportBytes {get; set;}
     public DateTime ReportDate {get; set;}
     public int NotifId {get; set;}
     public string RecipAdd {get; set;}
}

然后您可以将其投影到其中(只需指定类名而不是匿名):

(mfr, nr) => new MyPoco // Not anonymous
{ 
    ReportId=mfr.RPT_ID, 
    ...

然后再做修改:

foreach(var repljoinmf_data in repljoinmf)
{
  repljoinmf_data.NotifId = "SomeNewValue"

选项 #2 - 创建一个执行复杂逻辑的方法(或 Func)

由于您似乎已经将所有数据具体化,因此您可以在属性投影中自由使用复杂的功能。任何可用的局部变量(闭包)都可以传递给此函数,连接 lambda 参数也是如此 (mfr, nr)

例如,编写一个函数来计算您的 NotifId = "Changedxyz" 替换:

private string DoIntensiveLogic(mainframe_replication mfr, NOTIF_RECIP nr)
{
    // Do Stuff
}

然后您可以在原始匿名投影中使用它:

(mfr, nr) => new // Anon Class projection
{ 
    ReportId=mfr.RPT_ID, 
    Reportversion=mfr.RPT_VERS,
    ReportBytes= mfr.RPT_BYTES.ToString(),     
    ReportDate=mfr.REPL_DTM.ToString(),
    NotifId= DoIntensiveLogic(mfr, nr), // Call the function each row
    RecipAdd=nr.NOTIF_RECIP_ADDR 
});

关于c# - lambda 的 Linq 更新问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30326073/

相关文章:

c# - 我如何教计算机系统玩扑克牌?

c# - 适当的领域模型设计

c# - 从父子节点集合中查找死节点

c# - 字符串中只允许单一类型的标记

c# - 创建动态谓词 - 将属性作为参数传递给函数

lambda - 在方案中使用多个 lambda 是什么意思?

C++11 cin 输入验证

C#:相同签名的方法/构造函数和命名参数

c# - 发布 Azure Webjob 时缺少程序集 CS0234 WebJobs、CS0246 QueueTriggerAttributes

linq - 可以为 azure 表制作 IQueryable<Poco> 存储库吗