Получите TraceString для ваших бизнес-объектов в Entity Framework - PullRequest
0 голосов
/ 20 октября 2010

Как получить строку трассировки для запроса, подобного этому:

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 ]

7 голосов
/ 20 октября 2010

Разный ответ для другой проблемы.

Вы не можете позвонить 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();
5 голосов
/ 20 октября 2010

Это то, что вам нужно сделать:

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

Компилятор не будет принимать приведение из Product EntityObject к ObjectQuery, но IQueryable можно преобразовать в ObjectQuery, поэтому в основном вам нужно просто избавиться от этого метода .SingleOrDefault(), прежде чем пытаться увидеть строку трассировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...