2017-09-13 54 views
0

我試圖創建一個GetScalar方法。我們在遺留系統中使用了很多數據表。我將它們轉換爲EF。實體框架 - 獲取標量

這是目標。這是一個採用存儲過程名稱和參數的簡單方法,然後返回結果集的第一行,第一列。

public object GetScalar(string command, CommandType type = CommandType.StoredProcedure, List<SqlParameter> parameterList = null) 
    { 
     try 
     { 
      using (var cnn = new SqlConnection(ConnectionString)) 
      { 
       using (var cmd = new SqlCommand(command, cnn)) 
       { 
        cmd.CommandType = type; 

        if (parameterList != null) 
        { 
         foreach (var p in parameterList) 
         { 
          cmd.Parameters.Add(p); 
         } 
        } 

        cmd.Connection.Open(); 
        object obj = cmd.ExecuteScalar(); 
        cmd.Connection.Close(); 
        cmd.Parameters.Clear(); 
        return obj; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Logging.LogError(ex, "MSSqlUtility.GetScalar"); 
      return -1; 
     } 
    } 

我想在EF中有類似的方法。這是迄今爲止我所擁有的,但是這會返回所有列 - 而不僅僅是第一列。

protected T SelectScalar<T>(string inStoredProcedure, ICollection<SqlParameter> inParameters = null) 
    { 
     T result = default(T); 
     if (inParameters != null && inParameters.Count > 0) 
     { 
      string paramNames = string.Join(",", inParameters.Select(parameter => parameter.ParameterName).ToList()); 
      string sqlString = inStoredProcedure + " " + paramNames; 
      object[] paramValues = inParameters.Cast<object>().ToArray();    
      result = Database.SqlQuery<T>(sqlString, paramValues).FirstOrDefault(); 
     } 
     else 
     { 
      result = Database.SqlQuery<T>(inStoredProcedure).FirstOrDefault(); 
     } 

     return result; 
} 

示例用法。這會返回一個字符串對象 - 「John Doe」。

public string GetUserName(string employeeID) 
    { 
     if (string.IsNullOrWhiteSpace(employeeID)) 
     { 
      return string.Empty; 
     } 

     var parameters = new Collection<SqlParameter>();    
     parameters.Add(StoredProcedureParameterBuilder.StringParam("@EmployeeID", employeeID, 20)); 
     return this.SelectScalar<string>("dbo.GetUserName", parameters).Trim(); 
    } 

SQL查詢看起來是這樣的:

SELECT 
    FirstName + ' ' + Last Name 
,EmployeeID 
FROM Users 

更改存儲過程是不是一種選擇 - 我們需要在其他情況下兩列。當前的代碼返回名稱和ID。我想提取第一列,第一列,無論我的查詢可能吐出什麼。

+1

您可以添加如何使用此方法的示例以及結果是什麼樣子? –

回答

0

結束了不得不做更多的手動工作。如果任何人有更好的解決方案,我全部耳朵,但這適用於我的使用情況:

/// <summary> 
    /// Selects the first item in the query's result. 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="inStoredProcedure">The in stored procedure.</param> 
    /// <param name="inParameters">The in parameters.</param> 
    /// <returns>The first object in the specified type T.</returns> 
    protected T SelectScalar<T>(string inStoredProcedure, ICollection<SqlParameter> inParameters = null) 
    {    
     using (System.Data.IDbCommand command = Database.Connection.CreateCommand()) 
     { 
      try 
      {     
       command.CommandText = inStoredProcedure; 
       command.CommandTimeout = command.Connection.ConnectionTimeout; 

       if(inParameters != null && inParameters.Count > 0) 
       { 
        string paramNames = string.Join(",", inParameters.Select(parameter => parameter.ParameterName).ToList()); 
        command.CommandText += " " + paramNames; 
        foreach (var param in inParameters) 
        { 
         command.Parameters.Add(param); 
        } 
       } 

       Database.Connection.Open(); 
       return (T)command.ExecuteScalar(); 
      } 
      finally 
      { 
       Database.Connection.Close(); 
       command.Parameters.Clear(); 
      } 
     } 
    } 
+2

我想這是可行的,但它並沒有真正使用實體框架。 –

+0

好點。經過一番分析,EF將不適用於我們的使用。來自單個表格的查詢很好,但只要您開始加入其他表格,EF就會非常快速地變得非常複雜。 –