Как заставить linq производить точно sql, который я хочу?

Вам может потребоваться изменить коды для своих собственных нужд, но ниже приведена общая идея (например, замените «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
6
задан Zachary Scott 11 May 2009 в 16:18
поделиться

5 ответов

Если у вас есть рукописный 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/

7
ответ дан 8 December 2019 в 14:47
поделиться

Вот почему Linq Pad был создан в первую очередь. :) Это позволяет легко увидеть, что на выходе. Каковы будут результаты запроса и т. Д. Лучше всего это бесплатно. Возможно, не ответ на ваш вопрос, но я уверен, что он может вам помочь.

4
ответ дан 8 December 2019 в 14:47
поделиться

Я считаю, что лучше всего использовать хранимые процедуры. В этом случае вы имеете полный контроль над SQL.

1
ответ дан 8 December 2019 в 14:47
поделиться

Если вы точно знаете, какой sql вам нужен, вам следует использовать ExecuteQuery .

Я могу представить несколько способов перевести показанный вами запрос, но если вы обеспокоены тем, что «кроме» не может быть переведено.

  1. Проверьте это. Если это работает так, как вы хотите, то отлично, иначе:
  2. Перепишите его с элементами, которые, как вы знаете, переведут, например:

    db.Customers.Where (c =>! Db.Employees.Any (e => c) .Country == e.Country));

2
ответ дан 8 December 2019 в 14:47
поделиться

Если вы беспокоитесь о сгенерированном TSQL, я бы предложил формализовать запросы в хранимые процедуры или UDF и получить к ним доступ через контекст данных. Подход UDF имеет несколько лучшие метаданные и возможность компоновки (по сравнению с хранимой процедурой) - например, вы можете добавить дополнение , где / Пропустить / Снять и т. Д. В запрос UDF и запустить его в базе данных (но в прошлый раз, когда я проверял, только LINQ-to-SQL (не Entity Framework) поддерживал использование UDF).

Вы также можете использовать ExecuteQuery , но есть и преимущества позволяя базе данных владеть фиксированными запросами.

Чтобы узнать, что TSQL выполнил ... с LINQ-to-SQL вы можете назначить любой TextWriter (например, Console.Out ) to DataContext.Log .

2
ответ дан 8 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: