【问题标题】:Update Collection of entities in IQueryable mode在 IQueryable 模式下更新实体集合
【发布时间】:2015-04-09 11:56:04
【问题描述】:

我应该使用 EF 在 C# 代码中重写 SQL 代码:

UPDATE Submissions SET Other_Platform = (SELECT top 1 Other_Platform FROM Submission_Platform_Other_DistributionMethods WHERE Submission_ID = @SubmissionId )   

由于表 Submissions 中有很多记录,我不想将此集合转换为 List 以更新循环中的字段。

有人有什么想法吗?谢谢。


var otherPlatform = db.Submission_Platform_Other_DistributionMethods.FirstOrDefault(d => d.Submission_ID == subId);
var toUpdate = db.Submissions.Select(s=> UpdateSubmission(otherPlatform));

db.Submissions.AddRange(toUpdate);
db.SaveChanges();

这是我想到的一种可能的解决方案 - 创建一些方法(如映射器),将参数设置为 Other_Platform

【问题讨论】:

    标签: c# entity-framework iqueryable


    【解决方案1】:

    如果您想保持已完成更新的上下文警报。然后我认为除了循环遍历集合并更新平台然后保存更改之外没有其他方法。

    您可以执行其他两种方法,但是这些方法意味着更改会超出您在上下文中加载的实体,您必须重新创建上下文。

    1) 创建一个存储过程并使用您提供的参数执行它

    2) 对上下文执行sqlcommand

    using (var context = new MyContext()) 
    { 
        context.Database.SqlCommand("<update query here>"); 
    }
    

    【讨论】:

    • 是的,我相信这是唯一的方法,因为 EF 是关于 ORM 的。即使您使用 linq 或 lambda(如 Foreach(d =&gt; {.....}))语法来处理集合以设置值。在内部,它遍历 foreach 循环,EF 将在调用 Savechanges 时创建 n 个更新查询。
    猜你喜欢
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多