EF 6.1选择标量函数结果

时间:2016-09-08 09:33:12

标签: c# sql-server entity-framework entity-framework-6

如何使用Entity Framework 6.1 Code First选择数据库标量函数结果作为列?这是纯SQL查询:

SELECT
Id AS Id
, Name AS Name
, dbo.GetAdditionalInfo(Id) AS AdditionalInfo
FROM Users
WHERE Status = 1

数据库函数dbo.GetAdditionalInfo(INT Id)从其他表中收集信息并返回VARCHAR结果。如何使用EF 6.1做到这一点?我需要这样的东西:

var usersList = ctx.Users
.Where(n=>n.Status == 1)
.Select(n=>new{
    Id = n.Id
    , Name = n.Name
    , AdditionalInfo = ctx.DataBase.GetScalarFunctionResult<string>("dbo.GetAdditionalInfo (@)", n.Id)
}).ToList();

当然,

ctx.DataBase.GetScalarFunctionResult<T>(string ScalarFunctionName, params object args)

不存在且不起作用。但如果实施的话,它可能非常有用且易于使用。

3 个答案:

答案 0 :(得分:1)

您可以尝试如下所示。

命名空间: using System.Data.Entity.SqlServer

 var usersList = ctx.Users
     .Where(n=>n.Status == 1)
     .Select(n=>new{
       Id = n.Id, Name = n.Name,
       AdditionalInfo = ctx.Database.SqlQuery<string>(yourQuery, parameters).FirstOrDefault() 
       }).ToList();

参考: Execute Native SQL Query

答案 1 :(得分:1)

看来,你想要实现的目标在这里描述Entity Framework 6 Code First Custom Functions。它需要一个额外的库,因为看起来EF6不支持使用Code-first开箱即用(Calling a SQL User-defined function in a LINQ query)来调用UDF。

答案 2 :(得分:0)

您可以尝试这个(假设该类继承自DBContext):

String decryptedValue = String.Empty;
try {
   List<SqlParameter> parametros = new List<SqlParameter>();
   parametros.Add((new SqlParameter("@Data", value) { 
      SqlDbType = System.Data.SqlDbType.VarBinary }));
   parametros.Add((new SqlParameter("@KeyValue", key) { 
      SqlDbType = System.Data.SqlDbType.VarChar }));

   String v = null;
   v = this.Database.SqlQuery<String>(
      "SELECT SEGURIDAD.FN_Get_DecryptionData(@Data,@KeyValue)", parametros.ToArray()).FirstOrDefault();
   decryptedValue = v;
} catch(Exception ex) {

}