Можно ли сортировать в Entity Framework по sql-функции из базы данных? Я имею в виду что-то вроде:Entity Framework - сортировка по функции SQL
var xx = DbContext.Set<Article>()
.Where(x=>x.Name.Contains("X")).OrderBy("[dbo].[MySQLFunction]");
Можно ли сортировать в Entity Framework по sql-функции из базы данных? Я имею в виду что-то вроде:Entity Framework - сортировка по функции SQL
var xx = DbContext.Set<Article>()
.Where(x=>x.Name.Contains("X")).OrderBy("[dbo].[MySQLFunction]");
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 запросов
Я использую Code First, поэтому я не могу написать сложное вычисляемое свойство столбца, которое выполняет SQL-функцию (с параметрами). – foxiter
Единственный вариант я нашел - это что-то вроде плохой обходной путь, и я предполагаю, что это ограничено к простым запросам.
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();
Это очень интересно, но, как вы упомянули, только для не очень сложного запроса, и это немного рискованно :) – foxiter
@foxiter yeap, но все же очень странно, что мы не можем сделать этого с помощью динамического linq или чего-то подобного – FireAlkazar
Я думаю, вы должны использовать необработанный запрос в этом случае. http://stackoverflow.com/questions/18096519/entity-framework-raw-sql-query – vmeln
Я уверен, что это невозможно, и вы не можете смешивать LINQ/delta нотацию с SQL, хотя вы можете использовать SQL-запросы через EF. Можете ли вы добавить, что вы SQLFunction как функция C#? –
Я должен брать те же данные с поисковым вызовом, но он должен быть отсортирован по сложной функции. Я думаю, что могу написать его в нескольких сложных выражениях, но не могу объединиться в одно выражение. – foxiter