1

我有以下存储库:

public class GenericRepository<T> : IRepository<T> where T : class
{
    public GenericRepository(DbContext dbContext)
    {
        if (dbContext == null) 
            throw new ArgumentNullException("An instance of DbContext is required to use this repository", "context");
        DbContext = dbContext;
        DbSet = DbContext.Set<T>();
    }

    protected DbContext DbContext { get; set; }

    protected DbSet<T> DbSet { get; set; }

    public virtual IQueryable<T> Find(Expression<Func<T, bool>> predicate)
    {
        return DbSet.Where<T>(predicate);
    }

    public virtual IQueryable<T> GetAll()
    {

        return DbSet;
    }

和服务:

    private IRepository<Subject> _subjectsRepository;
    private IRepository<Content> _contentsRepository;

    public ContentService(IRepositoryProvider repositoryProvider)
        : base(repositoryProvider)
    {
        _subjectsRepository = GetStandardRepo<Subject>();
        _contentsRepository = GetStandardRepo<Content>();
    }

    public IList<Content> GetContents(int subjectId, int contentTypeId, int contentStatusId)
    {
        var contents = _contentsRepository.GetAll()
            .Where(a => a.SubjectId == subjectId &&
                   a.ContentTypeId == contentTypeId &&
                   (contentStatusId == 99 ||
                    a.ContentStatusId == contentStatusId))
            .ToList(); 
        return contents;
    }

我想找到发送到数据库的 SQL 文本。我知道我可以这样做:

db.GetCommand(query).CommandText

但是有人可以帮助我并告诉我应该把它放在我的代码中的什么地方。

我想找到发送到数据库的 SQL 文本,我知道我可以这样做

4

3 回答 3

6

您可以使用 SQL Server Management Studio 中的SQL Server 探查器工具来查看服务器接收到的内容以及在其上执行的内容。但是,这可能会影响性能,因此您不应该在生产服务器上运行它(除非您知道自己在做什么)。

其他选项是使用第三方分析器 - 例如来自 Hibernating Rhinos 的商业实体框架分析器,或者,如果使用 ASP.NET/MVC,则使用开源迷你分析器

于 2013-06-22T07:53:04.343 回答
2

您可以使用 ToTraceString() 跟踪 Linq to Entities 查询生成的 SQL 并将它们转储到日志中。

像这样的扩展方法

public static string ToTraceString<T>(this IQueryable<T> query)
{
    var objQuery = query as ObjectQuery<T>;
    if (objQuery != null)
    {
        return string.Format("{0}{2}{1}{2}{2}", DateTime.Now, objQuery.ToTraceString(), Environment.NewLine);

    }

    return string.Empty;
}

可以称为

var sql = _contentsRepository.GetAll().ToTraceString();
于 2013-06-22T18:35:02.873 回答
0

我会推荐使用 LinqPad ( http://www.linqpad.net/ )。

使用 LinqPad,您可以导入您自己的包含 DataContext 的程序集并使用您自己的 DAL 方法。见这里

运行代码片段后,您可以切换为结果视图和 SQL 视图(以及其他视图)。这是我们在使用 EntityFramework 时发现的最好的工具。我们还受益于能够更直接地调用我们的 DAL,而无需通过顶级应用程序层工作。

于 2013-08-30T19:39:47.953 回答