【问题标题】:SELECT INTO with EF4使用 EF4 选择进入
【发布时间】:2010-11-06 05:22:37
【问题描述】:

我是 c#、linq 和 EF4 的新手,所以请多多包涵。我敢肯定这很简单,但没有看到。

我要替换的存储过程执行 SELECT INTO 来查询一堆数据,进行一些简单的转换,然后将结果输出到另一个表中。然后在代码中返回这组数据进行本地处理。

我有一个查询,它将我的数据提取到匿名类型并处理所有转换。但是,我该如何将这些数据发送到结果表中?

最初,我想使用实体类型来存储我的初始结果。但是我有额外的字段,我需要进行本地处理,这些字段不会存储在结果表中。

感谢任何愿意帮我解决这个问题的 EF 大师!

编辑:这是一些基于 Morteza 帮助的伪代码,但似乎没有移动数据--

var ctx = new ReportEntities();
var query = from s in ctx.Source
            select new
            {
                s.SourceID,
                s.OtherStuff
            };

query.ToList().Select(q => new Report()
{
    SourceID = q.SourceID,
    OtherStuff = q.OtherStuff
});

ctx.SaveChanges();

【问题讨论】:

    标签: entity-framework linq-to-entities entity-framework-4


    【解决方案1】:

    从 EF4 开始,您可以使用个人存储过程更新模型并将它们作为函数导入。我认为最简单的方法是利用这个新功能并创建第二个过程,该过程接受结果数据作为参数并将它们保存到结果表中。因此,您可以在完成数据处理后调用此函数。

    更新:

    var ctx = new ReportEntities();
    var query = (from s in ctx.Source select new {
            s.SourceID,
            s.OtherStuff}).ToList();
    
    List<Report> reports = query.Select(q => new Report() 
    {
        SourceID = q.SourceID,
        OtherStuff = q.OtherStuff
    }).ToList();
    
    // Now you need to add your new report objects to the Context:
    foreach(report in reports) {
        ctx.Reports.AddObject(report);
    }
    
    // Now is the time to call the SaveChanges on ObjectContext:
    ctx.SaveChanges();
    

    【讨论】:

    • 我想过,这很容易。事情是......我正在努力学习以“新”方式做事。因此,我正在远离存储过程并试图将其保留在代码中。我是否打算这样做?
    • 好吧,既然您说“它将我的数据拉入匿名类型”,我推测您可能没有映射到该结果表的 EntityObject,但如果您有,那么您当然可以填充它与结果并在不使用存储过程的情况下将其保存到数据库中。你的模型中有这样的实体吗?
    • 是的,我正在投影到匿名类型,因为我返回的额外字段不在我的结果表中。我需要额外的字段来稍后在代码中进行一些本地处理。是的,结果表在我的 EDM 中。
    • 完美,因此您可以首先创建结果实体的新对象,然后使用 AddObject() 方法,然后使用 Context.SaveChanges() 将其插入 DB。如果您需要帮助,请告诉我。
    • 太棒了。我是沿着这些思路思考的。但是我不确定在匿名类型和实体对象之间移动数据。我是否需要手动循环匿名类型数据并为每条记录创建/设置一个新的实体对象?或者,有没有更简单的方法来移动/翻译它?我平均一次有 500-1000 条记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2011-05-14
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    相关资源
    最近更新 更多