【问题标题】:Trying to follow the example for ToTraceString(), but it fails. Why?尝试按照 ToTraceString() 的示例进行操作,但失败了。为什么?
【发布时间】:2016-05-13 20:47:28
【问题描述】:

我必须找到一种方法来找出与 EF 交互时生成的 SQL SELECT 是什么。我找到了描述它的 MSDN 在线帮助 ObjectQuery.ToTraceString Method() 并且我确信我已经完全遵循了这个例子,但是它失败了。我收到以下错误:

CS1503  Argument 2: cannot convert from 'string' to
'System.Linq.Expressions.Expression<System.Func<ResearchTableUpdates.Model.Template, bool>>'

我不明白为什么会收到此错误。以下是产生错误的代码:

using (var db = new MyDbContext())
{
    int idNum = 1;
    ObjectQuery<Model.Template> oqTemplate = db.Templates.Where("it.ID = @idNum");
    oqTemplate.Parameters.Add(new ObjectParameter("idNum", idNum));
    Console.WriteLine(oqTemplate.ToTraceString());

MyDbContext 是我定义的一个类。这是它的定义:

public class MyDbContext : Model.CoreFrameworkEntities
{
    public override int SaveChanges()
    {
        var modifiedEntities = ChangeTracker.Entries()
                .Where(p => p.State == EntityState.Modified)
                .Select(p => p.Entity);

        foreach (var modified in modifiedEntities)
        {
            Console.WriteLine();
            //modified.LastModifiedAt = now;
            Console.WriteLine(modified.ToString());
            Console.WriteLine();
        }
        return base.SaveChanges();
    }
}

最后,Model.CoreframeworkEntities 是一个定义为创建 .edmx 文件的 EF 模型。它是 .edmx 中的实体之一。 (据我了解,.edmx 文件中定义的任何实体都是 DbContext 数据类型。现在,如果这是错误的,我很想知道。)

我不确定我为什么会收到我的错误。在我看来,好像我已经在代码中遵循了 MSDN 文章。要么 MSDN 文章不再有效,要么我犯了一个错误,可能在我对 entity-relationship/.edmx 文件中的实体的理解中。

【问题讨论】:

    标签: c# .net entity-framework linq


    【解决方案1】:

    那是因为那篇文章使用了从ObjectContext 继承的上下文。您使用从DbContext 继承的上下文。旧的ObjectContextObjectSets,它确实有Where 重载,它接受字符串并返回ObjectQuery。但是DbContext(您使用的)具有DbSetsWhere 方法,它们不接受字符串,但只接受表达式,因此您的错误。对于DbContext,您通常要么使用拦截器,要么使用Database.Log 属性,如下所示:

    db.Database.Log = Console.WriteLine; // or any other handler
    var templates = db.Templates.Where(c => c.ID == idNum).ToArray(); // sql will be written to console.
    

    正如 Gert Arnold 在 cmets 中提到的,您也可以在查询时调用 ToString():

    db.Templates.Where(c => c.ID == idNum).ToString()
    

    但是在某些情况下您不能这样做(例如,您以Count()First() 等结束查询)。但是当你能做到这一点时,你只需要 sql 来处理某个单一的查询 - 当然ToString 方法更好。

    【讨论】:

    • db.Templates.Where(c =&gt; c.ID == idNum).ToString()
    • 谢谢 Evk 和 Gert。您对它为什么不起作用的解释(因为文章使用了 ObjectContext 而我使用的是从 DbContext 派生的类)是有道理的。 (顺便说一句,我希望人们会在他们的博客文章中注明日期。)我正在使用 FirstOrDefault(),所以也许我应该先使用 ToString(),然后再使用 FirstOrDefault() 进行另一个 C# 语句。
    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多