По моему опыту, издержки минимальны, при условии, что человек, пишущий запросы, знает то, что он делает, и примите обычные меры предосторожности, чтобы гарантировать, что сгенерированные запросы оптимальны, что необходимые индексы существуют и т.д. и т.д., Другими словами, влияние базы данных должно быть тем же; на стороне приложения существуют минимальные, но обычно незначительные издержки.
, Который сказал..., существует одно исключение к этому; если единый запрос генерирует несколько агрегатов, поставщик L2S переводит его в выполнение больших запросов с одним подзапросом на агрегат. Для большой таблицы это может оказать значительное влияние ввода-вывода, когда ввод-вывод дб, стоивший за запрос, растет величинами для каждого нового агрегата в запросе.
обходное решение для этого должно, конечно, переместить агрегаты в сохраненный proc или представление. У Matt Warren есть некоторый пример кода для альтернативного поставщика запроса, которые переводят такие запросы более эффективным способом.
Ресурсы:
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx? FeedbackID=334211
http://blogs.msdn.com/mattwar/archive/2008/07/08/linq-building-an-iqueryable-provider-part-x.aspx
Это исключение нельзя отладить без полной трассировки стека. Он имеет разное значение в зависимости от контекста. Обычно это означает, что вы делаете то, чего не должны делать внутри транзакции, но, не видя вызовов db или трассировки стека, все, что можно сделать, - это догадаться. Некоторые распространенные причины, о которых я знаю (и я уверен, что они далеко не исчерпывающие), включают:
TransactionScope
. Это вызывает продвижение к распределенной транзакции, и если вы не используете DTC, это не удастся. Обычно ответ не для включения DTC, а для очистки транзакции или завершения доступа к другим данным с помощью нового TransactionScope (TransactionOptions.RequiresNew)
. TransactionScope
. Я определенно не знаю всех возможных причин, но если вы опубликуете полную трассировку стека и фактические вызовы db в своем коде, я посмотрю и дам вам знать, если что-нибудь увижу.
У вас есть два вложенных объекта TransactionScope ??
И нет блока try catch.
http://msdn.microsoft.com/en-us/library/system.transactions. transactioncope.aspx
Я думаю, вы найдете конкретный ответ: вы не можете завершить транзакцию, которая еще не началась, она находится в недопустимом состоянии. У вас действительно есть какой-нибудь код, в котором находятся ваши комментарии LINQ? действительно ли соединение устанавливается?