7

使用此代码(带有或不带有“.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();
}

...我明白了,“无法将类型 '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;
}

...但似乎很浪费(当我想要的只是 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;
}

...但是我得到了,“ 'string' 必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法 'SQLite.SQLiteAsyncConnection.QueryAsync(string,参数对象[])' "

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

4

2 回答 2

9

来源

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

因此,如果您想要List<string>结果,则需要通过stringfor T。正如您所注意到的,string不能满足new()约束(因为它没有无参数构造函数),所以这是不可能的。

我浏览了代码,在我看来new()约束是不必要的,所以我的第一站是 sqlite-net 的人要求他们删除它(并验证它T=string是否有效)。

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

public sealed class DistinctGroupNamesResult
{
  public string GroupName { get; set; }
}

并使用一个简短的转换:

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();
}

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

于 2012-12-10T01:28:01.970 回答
6

尝试这个 :

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;
于 2015-11-17T08:45:25.837 回答