2012-12-09 2 views
1

SELECT DISTINCT를 사용하여 중개자를 잘라내어 목록을 반환하려고 시도했지만 작동하지 못해 모든 값을 얻은 다음 HashSet에 넣습니다. 무시하거나 중복 값을 허용하지 않음 :이 SQLite 작업에서 fat을 어떻게 다듬을 수 있습니까?

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

더 좋은 방법이 있어야합니다. 아무도 뭘 알아? 어쩌면 그것을 달성하는 LINQ 방법?

답변

3

어떻게 이런 일에 대해 :

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

이 훨씬 더 효율적으로 가져 오는 것보다 데이터베이스의 끝에서 고유 작업을 수행 할 모든 데이터베이스에서 데이터를 가져 와서 클라이언트에서 처리합니다.

+0

코드를 그대로 사용하려고하면이 기능을 사용하려고합니다. "오류 'string'은 public 매개 변수가없는 생성자가있는 추상 형식이 아니어야합니다 오류 암시 적으로 형식을 변환 할 수 없습니다 '은 System.Collections :'SQLite.SQLiteAsyncConnection.QueryAsync (문자열, PARAMS [] 오브젝트) ' " - 그리고"를 제네릭 형식 또는 메서드에 매개 변수'T '로 사용 .Generic.List 'to'System.Collections.Generic.HashSet ' " –

3

예, 고유() :

public async Task<IEnumerable<String>> SelectDistinctGroupNames() 
{ 
    var db = new SQLiteAsyncConnection(SQLitePath); 
    var allLocations = await db.QueryAsync<SOs_Locations>("SELECT * FROM SOs_Locations"); 
    return allLocations.Select(x=>x.GroupName).Distinct(); 
} 
+0

아직 데이터베이스에서 모든 레코드를 가져 오는 중입니다. –

+0

당신의 질문에 대한 인상은 SQL을 구별 할 수 없다는 것이 었습니다. 따라서 코드에서 구별 할 수있게 포기하고 더 간결한 코드를 원했습니다. 유일한 문제는 그것을 목록에 넣는 것입니까? 왜 HashSet으로 전환 했습니까? – tallseth

+1

HashSet은 중복을 자동으로 무시하거나 거부합니다. IOW, 그것은 당신에게 별개의 세트를줍니다. –

관련 문제