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>'"
从来源:
public Task<List<T>> QueryAsync<T> (string sql, params object[] args)
where T : new ()
Run Code Online (Sandbox Code Playgroud)
所以,如果你想List<string>作为一个结果,你会需要传递string的T.正如您所注意到的,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.
试试这个 :
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)