在C#中使用默认通用值

时间:2015-05-26 13:59:48

标签: c# ado.net dapper

我有一些用C#编写的代码。我正在尝试编写一些我可以重用的通用代码。我的实际代码更复杂。但是,代码问题如下所示:

public async Task<T> ExecuteQueryAsync<T>(string sql)
{
  var results = default(T);
  using (var database = new SqlConnection("[ConnectionString]"))
  {
    database.Open();
    results = await database.QueryAsync<T>(sql);                        
  }
  return results;
}

当我构建项目时,出现编译时错误:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<T>' to 'T'. An explicit conversion exists (are you missing a cast?)

我不完全理解为什么我会收到此错误。我打算用这样的方式来称呼它:

Adapter adapter = new Adapter();
var results = await adapter.ExecuteQueryAsync<IEnumerable<Customer>>("SELECT * FROM Customer");

在上文中,T不是IEnumerable<T>吗?如果是这种情况,我不明白为什么我在编译时遇到这种类型转换错误。

谢谢!

3 个答案:

答案 0 :(得分:5)

尝试这样的事情。

public async Task<IEnumerable<T>> ExecuteQueryAsync<T>(string sql)
{
  IEnumerable<T> results = Enumerable.Empty<T>();
  using (var database = new SqlConnection("[ConnectionString]"))
  {
    database.Open();
    results = await database.QueryAsync<T>(sql);                        
  }
  return results;
}

答案 1 :(得分:3)

ExecuteQueryAsync中,您不需要results变量,因为您始终会重写它。所以你的功能可以像这样

public async Task<IEnumerable<T>> ExecuteQueryAsync<T>(string sql)
{
    using (var database = new SqlConnection("[ConnectionString]"))
    {
        database.Open();
        return await database.QueryAsync<T>(sql);                        
    }
}

答案 2 :(得分:1)

这里已有很好的答案,但我想确保我们有一个支持安全查询参数化的答案。原始代码强制您编写令人难以置信的不安全代码,导致您的应用被黑客入侵。这可以避免这种情况:

public async Task<IEnumerable<T>> ExecuteQueryAsync<T>(string sql, dynamic Parameters = null)
{
  IEnumerable<T> results;
  using (var database = new SqlConnection("[ConnectionString]"))
  {
    database.Open();
    results = await database.QueryAsync<T>(sql, Parameters);                        
  }
  return results;
}

然后你可以这样称呼它:

Adapter adapter = new Adapter();
var results = await adapter.ExecuteQueryAsync<IEnumerable<Customer>>(
        "SELECT * FROM Customer WHERE Sales >= @Sales", 
        new {Sales = 500.0m});