获取Entity Framework中业务对象的TraceString

时间:2010-10-20 18:00:47

标签: 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();

2 个答案:

答案 0 :(得分:7)

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

您无法就此致电ToTraceString()

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

可以这样做:

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

......但它不是100%准确。 MSSQL EF提供程序将使用TOP 2 Single,这将遗漏。

你可以接近这个:

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

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

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

var ts = (product as ObjectQuery).ToTraceString();

答案 1 :(得分:5)

这是你需要做的:

string trace = ((ObjectQuery)_context.Products
                           .Where(p => p.Category == "Windows")).ToTraceString();

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

相关问题