在submitchanges方法触发之前拦截linq生成的TSQL

时间:2012-06-08 12:47:07

标签: c# linq linq-to-sql

在submitchanges()方法触发之前是否可以拦截linq生成的TSQL?我需要修改sql insert查询。

2 个答案:

答案 0 :(得分:2)

您无法修改SQL,但可以拦截插入过程。您生成的数据上下文应该具有Insert mehods的省略部分实现。例如,如果您的实体已命名,MyDbEntity

partial void InsertMyDbEntity(MyDbEntity instance);

由于这是部分的,因此您可以在围绕生成的数据上下文创建的分部类中对其进行修改。然后,您可以使用此挂钩从整个布料生成INSERT语句,或者只是调用您编写的自定义存储过程来处理您尝试实现的任何细微差别。

这是您可以做的最好的事情 - 您无法在此过程中检测现有的INSERT SQL。

答案 1 :(得分:0)

是的,可以拦截SubmitChanges()调用,但不能拦截SQL本身。

在我的应用程序中,我的.dbml文件名为“GlobalPricing.dbml”,我创建了一个名为GlobalPricingDataContext.cs的类。

public partial class GlobalPricingDataContext: System.Data.Linq.DataContext
{
    public override void SubmitChanges(ConflictMode failureMode)
    {
        int inserts = base.GetChangeSet().Inserts.Count;
        int updates = base.GetChangeSet().Updates.Count;
        int deletes = base.GetChangeSet().Deletes.Count;

        Trace.WriteLine(string.Format("{0}  There are {1} inserts, {2} updates and {3} deletes.", DateTime.Now.ToLongTimeString(), inserts, updates, deletes)); 

        base.SubmitChanges(failureMode);
    }
}

同样,此代码不允许您修改运行的SQL,但它至少会让您知道每个SubmitChanges()调用正在尝试执行的插入,更新和删除。