【问题标题】:Dynamically select and update a column value in LINQ resultset动态选择和更新 LINQ 结果集中的列值
【发布时间】:2025-11-30 07:25:01
【问题描述】:

我有一个存在 LINQ 结果集的场景;我使用了以下查询

var stockDetails = from d in db.BloodBanks
                   where d.bbUserName == Session["username"].ToString()
                   select d;

现在我想使用这个结果集并更新列的值。该列是通过字符串变量动态选择的。

我尝试使用的代码是:

foreach (BloodBank b in stockDetails)
            {
                b.<--column name from string variable--> = TextBox1.Text;
            }

请帮助我了解如何实现这一目标。

【问题讨论】:

    标签: c# asp.net linq-to-sql dynamic-linq


    【解决方案1】:

    您可以像这样使用反射按名称获取字段。

    foreach (BloodBank b in stockDetails)
    {
        FieldInfo f = typeof(BloodBank).GetField("fieldName");
        if (f != null)
        {
           f.SetValue(b, TextBox1.Text);
        }
    }
    

    【讨论】:

    • 不,它似乎不起作用。我用包含列名的 sting 变量替换了 fieldName。但最后 db.SubmitChanges(); 没有更新值。
    • 分析值后发现代码FieldInfo f = typeof(BloodBank).GetField("fieldName");在f中返回null
    • @Piyush @Bala 为什么要去Field,为什么不去Property 获取Get 方法或Set 方法?
    • 坦率地说,我对反射一无所知。我所知道的是FieldInfof 中返回null。尝试使用PropertyInfo,但在f.SetValue(b, TextBox.Text); 行中,它也要求提供第三个参数,如果我设置null,则会给我一个错误提示cant be converted to nullable.
    • 您能否发布一些关于 BloodBank 类和您尝试设置的属性/字段的信息?
    【解决方案2】:
    foreach (BloodBank b in db.BloodBanks.Where(d => where d.bbUserName == Session["username"].ToString())
    {
        b.col = TextBox1.Text;
    }
    

    【讨论】:

    • @Pyiush Cool,如果我可以问,为什么它在你的情况下不起作用?
    • 因为我想选择存储在字符串变量中的特定列。在您的情况下,您选择了我的数据库中不存在的col。实际上想要b."dynamic_column_name" = TextBox1.Text;