Мне удалось найти жизнеспособный долгосрочный обходной путь для этой проблемы. Это не совсем идеально, но до сих пор это было относительно безболезненно и гораздо менее страшно, чем альтернативы.
Так как эти запросы в любом случае являются чистым SQL - они все ExecuteQuery
для встроенного SQL или ExecuteMethodCall
для хранимых процедур - я решил просто перейти к «сырому» ADO.NET для случаев, когда я не Я не хочу, чтобы DataContext
знал о некоторых сущностях.
Конечно, было бы ужасно иметь дело с кучей IDbCommand
экземпляров и ручных отображений из IDataReader
, поэтому я потратил несколько часов этим утром на кодирование библиотеки, чтобы выполнить большую часть тяжелой работы для меня, выставив «свободно» (я использую термин «свободно») оболочку для IDbCommand
, автоматический LinqDataReaderMapper
, который использует MetaModel
, чтобы я мог использовать свои существующие сущности без изменений, и кучу перегруженных методов расширения для ускорить написание простых запросов.
В конце дня я пишу что-то вроде этого:
var results = context.Connection
.Command("SELECT Column1, Column2 FROM Table " +
"WHERE FilterColumn1 = @Param1 AND FilterColumn2 = @Param2")
.Parameters(
p => p.Name("Param1").Value(someValue),
p => p.Name("Param2").Value(someOtherValue))
.ExecuteReader()
.MapWith(context.Mapping).To<MyEntity>();
Или просто так:
var results = context
.ExecuteQueryRaw<MyEntity>(CommandType.StoredProcedure, "SomeProc",
new { Param1 = someValue, Param2 = someOtherValue });
Я не собираюсь публиковать весь код для него - он довольно длинный, и я думаю, что это будет просто большой tl; dr на данный момент - но основная идея заключается в том, что оба они дают я возвращаю IEnumerable<MyEntity>
, и, поскольку они копируются непосредственно из IDataReader
, они по сути являются отдельными объектами - DataContext
не имеет прямого представления о них и поэтому не может ни перехватывать результаты, ни отслеживать их после факта .
Итак, проблема частично решена, хотя было бы лучше, если бы я мог заставить DataContext
вести себя сам.