我試圖創建一個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。我想提取第一列,第一列,無論我的查詢可能吐出什麼。
您可以添加如何使用此方法的示例以及結果是什麼樣子? –