从单个字符串列请求1..N值时,QueryAsync()返回什么?

B. *_*non 5 c# sqlite return-type linq-to-sql async-await

使用此代码(带或不带".ToList()"):

public async Task<List<String>> SelectDistinctGroupNames()
{
    var db = new SQLiteAsyncConnection(SQLitePath);
    var groupNames = await db.QueryAsync<List<string>>("SELECT DISTINCT GroupName FROM SOs_Locations");
    return groupNames.ToList();
}
Run Code Online (Sandbox Code Playgroud)

...我得到," 不能隐式地将类型'System.Collections.Generic.List>'转换为'System.Collections.Generic.List' "

这有效:

public async Task<HashSet<String>> SelectDistinctGroupNames()
{
    var db = new SQLiteAsyncConnection(SQLitePath);
    var allLocations = await db.QueryAsync<SOs_Locations>("SELECT * FROM SOs_Locations ORDER BY GroupName");
    HashSet<string> hashsetGroupNames = null;
    foreach (var item in allLocations)
    {
        hashsetGroupNames.Add(item.GroupName);
    }
    return hashsetGroupNames;
}
Run Code Online (Sandbox Code Playgroud)

...但似乎很浪费(抓住所有记录,当我想要的只是GroupName列中的不同值).

在我看来,当用"DISTINCT GroupName"替换sql查询中的"*"时,需要的是List或者甚至是HashSet

那么当返回几个记录中的单个列时,究竟返回了什么?IOW,在QueryAsync <>()调用的尖括号内应该是什么?

我认为这会奏效:

public async Task<List<String>> SelectDistinctGroupNames()
{
    var db = new SQLiteAsyncConnection(SQLitePath);
    List<string> allLocations = await db.QueryAsync<string>("SELECT DISTINCT GroupName FROM SOs_Locations ORDER BY GroupName");
    return allLocations;
}
Run Code Online (Sandbox Code Playgroud)

...但是我知道," 'string'必须是一个非抽象类型,带有一个公共无参数构造函数,以便在泛型类型或方法'SQLite.SQLiteAsyncConnection.QueryAsync(string, params object [])' "

我在上面有一个"字符串",与方法的工作版本中的<SOs_Locations>(不是"List <SOs_Locations>")相对应.当我将其更改为"List <string>"时,我得到"无法将类型'System.Collections.Generic.List <System.Collections.Generic.List' 隐式转换为'System.Collections.Generic.List <string>'"

Ste*_*ary 7

来源:

public Task<List<T>> QueryAsync<T> (string sql, params object[] args)
        where T : new ()
Run Code Online (Sandbox Code Playgroud)

所以,如果你想List<string>作为一个结果,你会需要传递stringT.正如您所注意到的,string无法满足new()约束(因为它没有无参数构造函数),因此这是不可能的.

我看了一下代码,它看起来像new()约束是不必要的,所以我的第一站是sqlite-net人要求他们删除它(并验证T=string它将工作).

在此期间,您应该能够为此查询的结果创建一个类型:

public sealed class DistinctGroupNamesResult
{
  public string GroupName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并使用简短的转换:

public async Task<List<String>> SelectDistinctGroupNames()
{
  var db = new SQLiteAsyncConnection(SQLitePath);
  var result = await db.QueryAsync<DistinctGroupNamesResult>("SELECT DISTINCT GroupName FROM SOs_Locations");
  return result.Select(x => x.GroupName).ToList();
}
Run Code Online (Sandbox Code Playgroud)

可能有更简单的解决方案,例如,使用更高级别的LINQ提供程序(不确定它是否支持DISTINCT).或者可以使用SOs_Locations结果类型而不是DistinctGroupNamesResult.


Fat*_*Nik 5

试试这个 :

List<String> resultString = new List<string>(); 
var result = await db.QueryAsync<DistinctGroupNamesResult>("SELECT * FROM SOs_Locations");

foreach (string item in result.Select(x=> x.GroupName).Distinct())
{
    resultString.Add(item);
}

return resultString;
Run Code Online (Sandbox Code Playgroud)