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列からの個別の値だけが必要な場合は、すべてのレコードを取得します)。

SQLクエリの「*」を「DISTINCTGroupName」に置き換える場合、必要なのはリストまたはHashSetであるように思われます。

では、複数のレコードから1つの列が返されると、正確には何が返されますか?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;
}

...しかし、「文字列」は、ジェネリック型またはメソッド「SQLite.SQLiteAsyncConnection.QueryAsync(string、 params object [])' "

メソッドの作業バージョンの<SOs_Locations>(「リスト>」ではない)に対応する上記の「文字列」がありました。<SOs_Locations「リスト>」に変更すると、「タイプ'System.Collections.Generic.List 'を'System.Collections.Generic.List >'に<string暗黙的に変換できません」というメッセージが表示されます。<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>、結果として必要な場合は、に合格する必要がありstringます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 に答える