【问题标题】:EntityFramework Extended how to update using values in a dictionaryEntityFramework 扩展了如何使用字典中的值进行更新
【发布时间】:2015-11-03 12:46:58
【问题描述】:

我正在尝试使用以下代码更新表格

Dictionary<int, decimal> myDictionary = GetDictionary();

Context.Persons
.Where(t => mydictionary.Select(s => s.Key).Contains(t.Id))
.Update(t => new Person { Salary = mydictionary[t.Id] });

无法创建类型的常量值 'System.Collections.Generic.KeyValuePair`2[[System.Int32, mscorlib, 版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089],[System.Decimal, mscorlib, 版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]]'。 仅支持原始类型或枚举类型 上下文。

【问题讨论】:

    标签: c# entity-framework linq linq-to-entities entity-framework-6


    【解决方案1】:

    问题是 EF 无法将您的字典实例转换为 sql 表示法。正如异常所说,您只能使用原始类型集合或枚举类型集合。为避免此问题,请先进行投影以获取键,然后声明您的查询:

     var keys= mydictionary.Select(s => s.Key);
     var query=Context.Persons.Where(t => keys.Contains(t.Id));
     foreach(var person in query)
     {
       person.Salary=mydictionary[person.Id];
     }
     Context.SaveChanges();
    

    我不知道Update 方法是如何实现的,我猜是自定义扩展方法,但我想警告您,Linq 用于查询数据,而不是修改它们,这是我在我的编码foreach 来修改查询返回的每个人,最后我调用SaveChanges 方法来保存所有更改。

    【讨论】:

    • 我正在使用实体框架扩展库,它具有 Update() 和 Delete() 扩展方法。
    • 我不知道,谢谢。无论如何,我不知道如何使用字典或查询中的其他集合更新每个人的适当薪水。
    • 我看了一下EntityFramework扩展库中Update方法的代码,它的工作原理和SQL UPDATE差不多,所以用这个方法你可以更新几个列,但使用相同满足 Where 条件的所有行的值。所以恐怕用这种方法你不能更新每个人的工资。
    猜你喜欢
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多