2014-02-12 5 views
5

Ist es möglich, in Entity Framework nach SQL-Funktion aus der Datenbank zu sortieren? Ich meine so etwas wie:Entity Framework - nach SQL-Funktion sortieren

var xx = DbContext.Set<Article>() 
     .Where(x=>x.Name.Contains("X")).OrderBy("[dbo].[MySQLFunction]"); 
+1

Ich denke, Sie sollten in diesem Fall rohe Abfrage verwenden. http://stackoverflow.com/questions/18096519/entity-framework-raw-sql-query – vmeln

+2

Ich bin ziemlich sicher, dass dies nicht möglich ist, und Sie können nicht LINQ/Delta-Notation mit SQL mischen, obwohl Sie SQL-Abfragen über verwenden können EF. Können Sie Ihre SQLFunction als C# -Funktion hinzufügen? –

+0

Ich muss die gleichen Daten mit Paging nehmen, aber es sollte nach komplexer Funktion sortiert werden. Ich denke, ich könnte es in mehrere komplexe Ausdrücke schreiben, kann aber nicht zu einem Ausdruck verschmelzen. – foxiter

Antwort

2
var xx = DbContext.Set<Article>() 
     .Where(x=>x.Name.Contains("X")) 
     .Select(x=> new 
     { 
      Article = x, 
      orderItem = SqlFunction.//Any function you want to use. 
            // Or may you want to use DbFunctions    
     }) 
     .OrderBy(x=>x.orderItem); 

Hier finden Sie ausführliche Informationen über DbFunctions und SqlFunctions


Update:

By the way, bedeuten, wenn Sie verwenden Ihre benutzerdefinierte SQL-Funktion dann rate ich Ihnen eine berechnete Spalte in der Tabelle zu machen und diese Spalte dieses SqlFunction machen verwenden, dann können Sie dieses Feld orderby oder Filter gegen normale Linq mit abfragt

+0

Ich benutze Code First, also kann ich keine komplexe berechnete Spalteneigenschaft schreiben, die SQL-Funktion (mit Parametern) ausführt. – foxiter

1

Die einzige Option, die ich gefunden - ist so etwas wie schlechte Problem zu umgehen, und ich denke, das ist auf einfache Abfragen beschränkt.

var objectContext = ((IObjectContextAdapter)DbContext).ObjectContext; 
var query = (System.Data.Objects.ObjectQuery)objectContext.CreateObjectSet<User>().Where(u => u.Id != Guid.Empty); 

var initialQueryString = query.ToTraceString(); 
var resultQueryString = initialQueryString + " order by [dbo].[MySQLFunction]"; 

//careful here, if you use MS SQL you need to use SqlParameter instead of NpgsqlParameter 
var paramValues = new List<NpgsqlParameter>(); 
foreach (var param in query.Parameters) 
{ 
    paramValues.Add(new NpgsqlParameter(param.Name, param.Value)); 
} 

var result = objectContext.ExecuteStoreQuery<User>(resultQueryString, paramValues.Cast<object>().ToArray()).ToList(); 
+0

Es ist sehr interessant, aber wie Sie erwähnen, nur für nicht sehr komplexe Abfrage und es ist ein wenig riskant :) – foxiter

+0

@foxiter yeap, aber immer noch sehr seltsam können wir das nicht durch dynamische linq oder so etwas tun – FireAlkazar