2012-12-09 45 views
4

有了這個代碼(有或沒有」 .ToList() 「):QueryAsync()從單個字符串列請求1..N個值時返回什麼?

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>' 到「系統.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; 
} 

...但似乎浪費(搶佔了所有的記錄,當所有我要的是從組名列不同的值)。

這在我看來,我們需要的是一個列表,甚至當更換一個HashSet的「*」與「不同的組名」 SQL查詢

那麼究竟什麼是返回時,從幾個單個列記錄被返回? 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; 
} 

...但是,我得到的,「‘串’必須是爲了使用它的非抽象類型與公共參數構造函數如在通用類型或方法參數「T」「SQLite.SQLiteAsyncConnection.QueryAsync(字符串,params對象[])」

我有一個‘串’上方與<SOs_Locations對應>(不是」列表<SOs_Locations> 「)在該方法的工作版本中。當我將其更改爲 「列表<string>」,我得到 「無法隱式轉換類型 'System.Collections.Generic.List <System.Collections.Generic.List' 到 'System.Collections.Generic.List <string>'」

回答

6

the source

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

所以,如果你想List<string>結果,你就需要通過stringT。正如你注意到的,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

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; 
相關問題