实体框架 - 按SQL函数排序

时间:2014-02-12 10:30:44

标签: c# entity-framework sql-function

是否可以通过数据库中的sql函数对Entity Framework进行排序? 我的意思是:

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

2 个答案:

答案 0 :(得分:3)

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,然后你就可以使用OrderBy或者对这个字段进行过滤使用正常的Linq查询

答案 1 :(得分: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();