获取Entity Framework中业务对象的TraceString

Wat*_* v2 0 c# entity-framework entity-framework-4

如何获取此类查询的跟踪字符串:

var product = _context.Products.Where( p => p.Category == "Windows" )
                               .SingleOrDefault();

// I can't do this since product is not an ObjectQuery instance
// product.ToTraceString();
Run Code Online (Sandbox Code Playgroud)

Cra*_*ntz 7

针对不同问题的不同答案.

你不能这样打电话ToTraceString():

var product = _context.Products.Where( p => p.Category == "Windows" )
                               .SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)

可以这样做:

var q = _context.Products.Where( p => p.Category == "Windows" )
var ts = ((ObjectQuery)q).ToTraceString();
var product = q.SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)

......但它不是100%准确.在MSSQL EF提供商将使用TOP 2Single此会错过.

你可以接近这个:

var q = _context.Products.Where( p => p.Category == "Windows" )
var ts = ((ObjectQuery)q.Take(2)).ToTraceString();
var product = q.SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)

...它应该为您提供正确的SQL,但需要了解实现.

原始问题歪曲了问题.我原来的答案是:

var ts = (product as ObjectQuery).ToTraceString();
Run Code Online (Sandbox Code Playgroud)


Mor*_*avi 5

这是你需要做的:

string trace = ((ObjectQuery)_context.Products
                           .Where(p => p.Category == "Windows")).ToTraceString();
Run Code Online (Sandbox Code Playgroud)

编译器不接受从Product EntityObject到ObjectQuery的转换,但IQueryable <Product>可以转换为ObjectQuery,所以基本上你只需要.SingleOrDefault()在尝试查看跟踪字符串之前摆脱该方法.