Frage

Im vergangenen Jahr Scott Guthrie angegeben „Sie können die rohen SQL tatsächlich außer Kraft setzen, die LINQ to SQL verwendet, wenn Sie absolute Kontrolle über die ausgeführten SQL wollen“, aber ich kann eine Dehnbarkeit Methode nicht Dokumentation beschreibt.

Ich mag die folgende LINQ to SQL-Abfrage ändern:

using (NorthwindContext northwind = new NorthwindContext ()) {
    var q = from row in northwind.Customers
            let orderCount = row.Orders.Count ()
            select new {
                row.ContactName,
                orderCount
            };
}

Was ergibt sich folgende TSQL:

SELECT [t0].[ContactName], (
    SELECT COUNT(*)
    FROM [dbo].[Orders] AS [t1]
    WHERE [t1].[CustomerID] = [t0].[CustomerID]
    ) AS [orderCount]
FROM [dbo].[Customers] AS [t0]

An:

using (NorthwindContext northwind = new NorthwindContext ()) {
    var q = from row in northwind.Customers.With (
                        TableHint.NoLock, TableHint.Index (0))
            let orderCount = row.Orders.With (
                        TableHint.HoldLock).Count ()
            select new {
                row.ContactName,
                orderCount
            };
}

Welche würde Ergebnis in der folgenden TSQL:

SELECT [t0].[ContactName], (
    SELECT COUNT(*)
    FROM [dbo].[Orders] AS [t1] WITH (HOLDLOCK)
    WHERE [t1].[CustomerID] = [t0].[CustomerID]
    ) AS [orderCount]
FROM [dbo].[Customers] AS [t0] WITH (NOLOCK, INDEX(0))

Mit:

public static Table<TEntity> With<TEntity> (
    this Table<TEntity> table,
    params TableHint[] args) where TEntity : class {

    //TODO: implement
    return table;
}
public static EntitySet<TEntity> With<TEntity> (
    this EntitySet<TEntity> entitySet,
    params TableHint[] args) where TEntity : class {

    //TODO: implement
    return entitySet;
}

Und

public class TableHint {
    //TODO: implement
    public static TableHint NoLock;
    public static TableHint HoldLock;
    public static TableHint Index (int id) {
        return null;
    }
    public static TableHint Index (string name) {
        return null;
    }
}

irgendeine Art von LINQ to SQL Erweiterbarkeit verwenden, außer dieses . Irgendwelche Ideen?

War es hilfreich?

Lösung

Die Fähigkeit, die zugrunde liegenden Anbieter zu ändern und damit die SQL ändert nicht den letzten Schnitt in LINQ to SQL machen.

Andere Tipps

Matt Warren Blog hat alles, was Sie dazu brauchen:

http://blogs.msdn.com/mattwar/

Sie möchten einen Ausdrucksbaum in SQL übersetzen ... Sie müssen Ihre eigenen IQueryProvider

implementieren

IQueryProvider Referenz
Wie

MSDN Wie

Datacontext x = new Datacontext;

// So etwas wie dies vielleicht?

var a = x.Where (). Mit () ... etc

Lassen Sie uns Ihnen eine viel feinere Kontrolle über die SQL haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top