2014-02-12 106 views
5

是否可以通過數據庫中的sql函數對實體框架進行排序? 我的意思是這樣:實體框架 - 按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); 

這裏有更多有關DbFunctionsSqlFunctions


更新:

順便說一句,如果你的意思是使用你的自定義SQLFunction然後我建議你做一個計算列在你的餐桌,使此列使用此SQLFunction,那麼你可以對使用正常的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