是否可以通過數據庫中的sql函數對實體框架進行排序? 我的意思是這樣:實體框架 - 按SQL函數排序
var xx = DbContext.Set<Article>()
.Where(x=>x.Name.Contains("X")).OrderBy("[dbo].[MySQLFunction]");
是否可以通過數據庫中的sql函數對實體框架進行排序? 我的意思是這樣:實體框架 - 按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
更新:
順便說一句,如果你的意思是使用你的自定義SQLFunction然後我建議你做一個計算列在你的餐桌,使此列使用此SQLFunction,那麼你可以對使用正常的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