Вам может потребоваться изменить коды для своих собственных нужд, но ниже приведена общая идея (например, замените «Module2» на название вашего модуля и включите дополнительные проверки, чтобы определить, куда добавлять новые коды)
Public Sub sub_test()
Dim i As Long
With ThisWorkbook.VBProject.VBComponents("Module2").CodeModule
For i = 1 To .Countoflines
If InStr(.Lines(i, 1), "End Sub") > 0 Then
.Insertlines i, "**logging_successful = popCallFromStack(""sub a"")**"
End If
Next i
End With
End Sub
Если у вас есть рукописный SQL, вы можете использовать ExecuteQuery, указав тип класса «row» в качестве аргумента шаблона функции:
var myList = DataContext.ExecuteQuery<MyRow>(
"select * from myview");
Класс «row» предоставляет столбцы как открытые свойства. Например:
public class MyRow {
public int Id { get; set; }
public string Name { get; set; }
....
}
Вы можете украсить столбцы дополнительной информацией:
public class MyRow {
....
[Column(Storage="NameColumn", DbType="VarChar(50)")]
public string Name { get; set; }
....
}
По моему опыту, linq to sql не генерирует очень хороший код SQL, а код, который он генерирует, разбивает для больших баз данных. Что очень хорошо делает linq to sql, так это предоставляет хранимые процедуры вашему клиенту. Например:
var result = DataContext.MyProcedure(a,b,c);
Это позволяет вам хранить SQL в базе данных, имея при этом преимущества простой в использовании автоматически генерируемой оболочки .NET.
Чтобы увидеть точный используемый SQL, вы можете использовать SQL Server. Инструмент профилировщика:
http://msdn.microsoft.com/en-us/library/ms187929.aspx
Визуализатор отладки Linq-to-Sql:
http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx
Или вы можете написать собственный код для регистрации запросов:
http://goneale.wordpress.com/2008/12/31/log-linq-2-sql-query-execution-to-consoledebug-window/
Вот почему Linq Pad был создан в первую очередь. :) Это позволяет легко увидеть, что на выходе. Каковы будут результаты запроса и т. Д. Лучше всего это бесплатно. Возможно, не ответ на ваш вопрос, но я уверен, что он может вам помочь.
Я считаю, что лучше всего использовать хранимые процедуры. В этом случае вы имеете полный контроль над SQL.
Если вы точно знаете, какой sql вам нужен, вам следует использовать ExecuteQuery .
Я могу представить несколько способов перевести показанный вами запрос, но если вы обеспокоены тем, что «кроме» не может быть переведено.
Перепишите его с элементами, которые, как вы знаете, переведут, например:
db.Customers.Where (c =>! Db.Employees.Any (e => c) .Country == e.Country));
Если вы беспокоитесь о сгенерированном TSQL, я бы предложил формализовать запросы в хранимые процедуры или UDF и получить к ним доступ через контекст данных. Подход UDF имеет несколько лучшие метаданные и возможность компоновки (по сравнению с хранимой процедурой) - например, вы можете добавить дополнение , где
/ Пропустить
/ Снять
и т. Д. В запрос UDF и запустить его в базе данных (но в прошлый раз, когда я проверял, только LINQ-to-SQL (не Entity Framework) поддерживал использование UDF).
Вы также можете использовать ExecuteQuery
, но есть и преимущества позволяя базе данных владеть фиксированными запросами.
Чтобы узнать, что TSQL выполнил ... с LINQ-to-SQL вы можете назначить любой TextWriter
(например, Console.Out
) to DataContext.Log
.