2014-02-12 5 views
5

Можно ли сортировать в Entity Framework по sql-функции из базы данных? Я имею в виду что-то вроде:Entity Framework - сортировка по функции SQL

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

Я думаю, вы должны использовать необработанный запрос в этом случае. http://stackoverflow.com/questions/18096519/entity-framework-raw-sql-query – vmeln

+2

Я уверен, что это невозможно, и вы не можете смешивать LINQ/delta нотацию с SQL, хотя вы можете использовать SQL-запросы через EF. Можете ли вы добавить, что вы SQLFunction как функция C#? –

+0

Я должен брать те же данные с поисковым вызовом, но он должен быть отсортирован по сложной функции. Я думаю, что могу написать его в нескольких сложных выражениях, но не могу объединиться в одно выражение. – foxiter

ответ

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); 

Здесь больше информации о DbFunctions и SqlFunctions


Update:

Кстати, если вы имеете в виду использовать ваш пользовательский SQLFunction, тогда я советую вам сделать вычисляемый столбец в таблице и сделать этот столбец использовать эту SQLFunction, то вы могли бы OrderBy или фильтр против этого поля с помощью обычного Linq запросов

+0

Я использую Code First, поэтому я не могу написать сложное вычисляемое свойство столбца, которое выполняет SQL-функцию (с параметрами). – foxiter

1

Единственный вариант я нашел - это что-то вроде плохой обходной путь, и я предполагаю, что это ограничено к простым запросам.

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

Это очень интересно, но, как вы упомянули, только для не очень сложного запроса, и это немного рискованно :) – foxiter

+0

@foxiter yeap, но все же очень странно, что мы не можем сделать этого с помощью динамического linq или чего-то подобного – FireAlkazar

Смежные вопросы