Die beste Möglichkeit, dynamische Abfragen mit dynamischen Ergebnissen mit Linq oder Expression Tree zu schreiben

c# expression-trees linq linq-to-sql

Frage

Ich suche nach der besten Möglichkeit, eine Abfrage mit LINQ oder einem Ausdrucksbaum zu schreiben, um ein dynamisches Ergebnis gemäß dynamischer Eingabe zurückzugeben. Betrachten Sie zum Beispiel diesen Pseudocode:

CREATE PROCEDURE Test
@Input      NVARCHAR(50)
AS
BEGIN
DECLARE @Query      NVARCHAR(100);
SET @Query=N'SELECT ' + @Input + ' FROM MyTable'

EXEC @Query
END

Was ist der beste Weg zu:

  1. Codieren Sie dies mithilfe von LINQ oder einer Ausdrucksstruktur
  2. Nennen Sie dies als gespeicherte Prozedur mit LINQ to SQL

BEARBEITEN 1)

Betrachten Sie jede dynamische Abfrage nicht enthält SELECT statement.for Beispiel ich einen dynamischen kürzlich schreiben PIVOT query.So Ich kann nicht verwenden Dynamische LINQ

Akzeptierte Antwort

Dynamische Linq? Wahrscheinlich nicht

Ich würde Dynamic Linq vorschlagen, aber wie Ihr "Edit" sagt, wird das nicht für Sie tun.

In diesem Fall würde ich sagen, die Antwort auf Ihre Frage lautet "Es gibt keinen besten Weg".

Ist Linq die beste Wahl dafür?

Ihre Frage fragt nach einer Linq, speziell einer Linq to Sql, Implementierung, wie Sie Ihre dynamischen Abfragen erreichen können.

Aber bedenken Sie, was Linq für Sql ist. Die wichtigsten Vorteile von Linq an SQL sind:

  1. Stark typisierte Abfragen (Fehler beim Kompilieren abfangen)
  2. Stark typisierte Ergebnisse. Bedeutende nette vor-geschriebene Klassen (in Linq zu SQL Fall, vor generiert)

Wenn Sie jetzt "Select" -Anweisungen ausführen und immer eine tatsächlich zugeordnete Tabelle zurückgeben, gibt es keinen Grund, warum Sie die dynamische Linq-Bibliothek nicht verwenden können.

Wenn Sie jedoch willkürliche, nicht gemappte Ergebnisse zurückgeben, ist die Verwendung von LINQ sinnlos, in der Tat wird es Sie nicht zulassen.

DataContext.ExecuteQuery<T>(string query)

Die DataContext Klasse verfügt zwar über eine ExecuteQuery<T> -Methode, aber Sie können leider nicht angeben, dass dynamic als T :-(

Linq zu SQL und gespeicherten Prozeduren

Schließlich kann LINQ to SQL gespeicherte Prozeduren zuordnen. Sie könnten also eine Stored Procedure haben, die eine Abfrage als Argument nimmt, wie in Ihrem Beispiel. Allerdings glaube ich, dass es die gleichen Einschränkungen von ExecuteQuery hinsichtlich der Typen gibt, die sich ergeben können, aber halte mich nicht daran fest.

Ich würde das als Ihre letzte Option betrachten und den Sproc im Linq to SQL-Designer untersuchen, der entweder einen anonymen, einen dynamischen oder einen zugeordneten Typ zurückgibt.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum