Linq-SQL ToDictionary ()


81

Linq를 사용하여 SQL (2008)의 두 열을 사전 (캐싱 용)으로 올바르게 변환하려면 어떻게해야합니까?

현재 IQueryable b / c를 반복하여 ToDictionary 메서드를 작동 할 수 없습니다. 어떤 아이디어? 이것은 작동합니다 :

var query = from p in db.Table
            select p;

Dictionary<string, string> dic = new Dictionary<string, string>();

foreach (var p in query)
{
    dic.Add(sub.Key, sub.Value);
}

내가 정말로하고 싶은 것은 다음과 같이 작동하지 않는 것 같습니다.

var dic = (from p in db.Table
             select new {p.Key, p.Value })
            .ToDictionary<string, string>(p => p.Key);

하지만이 오류가 발생합니다. 'System.Linq.IQueryable'에서 'System.Collections.Generic.IEnumerable'로 변환 할 수 없습니다.

답변:


121
var dictionary = db
    .Table
    .Select(p => new { p.Key, p.Value })
    .AsEnumerable()
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
;

죄송합니다. 분명하지 않았을 수 있습니다. 이전에 시도해 보았지만 이것은 Dictionary <string, string>이 ​​아닌 Dictionary <string, #Anonymous Type>을 생성합니다
Codewerks

시도해보십시오 kvp => kvp.Value as string. 대답의 요점은 .AsEnumerable().
yfeldblum

감사합니다. AsEnumerable이 필요하다고 생각했지만 ToDictionary 호출이 여전히 작동하지 않습니다. 두 열 모두 SQL에서 varchars이므로 문자열로 반환되지만 Dic에 넣는 방법을 알아낼 수 없습니다 ....
Codewerks

이것이 여전히 관련이 있는지 모르겠지만 왜 AsEnumerable필요한가요? 나에게는 그것도없이 작동하지만, 아마 Linq에 이미 (7 년이 경과 한) 변경
알렉산더 Derck

1
@AlexanderDerck-당시에 AsEnumerable는 필요했습니다. 모든이 시간 이후, 그러나 가능한 설명은 즉 내가 왜 정확하게 기억하지 않습니다 ToDictionary에 대한 확장 방법이었다 IEnumerable, 그러나 Linq에 - 투 - SQL에 대한 인터페이스가 아니었다 IEnumerable.
yfeldblum

16

키만 정의하고 있지만 값도 포함해야합니다.

var dic = (from p in db.Table
             select new {p.Key, p.Value })
            .ToDictionary(p => p.Key, p=> p.Value);

3
-1 오류는 <string, string>부품이 public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer);과부하 대신 과부하를 사용하게 만든다는 것 public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector);입니다.
user247702

나는 여전히 필요하다고 생각 .AsEnumerable()하기 전에.ToDictionary()
AceMark

완벽하게 작동 ... 내가 찾던 마지막으로 한
브라이언

9

감사합니다. 귀하의 답변은이 문제를 해결하는 데 도움이되었습니다.

var dic = db
        .Table
        .Select(p => new { p.Key, p.Value })
        .AsEnumerable()
        .ToDictionary(k=> k.Key, v => v.Value);

5
AsEnumerable ()이 필요한 이유는 LINQ to SQL이 로컬 및 원격 (SQL) 처리를 혼합하지 않기 때문에 첫 번째 부분이 SQL 서버에서 실행되고 마지막 후속 부분이 LINQ to Objects를 사용하여 로컬에서 실행됩니다. do Dictionarys :)
DamienG

말이된다. 또한 ToDictionary의 두 번째 매개 변수에는 자체 Func 인수가 필요합니다.
Codewerks

1

변환하기 위해 테이블의 모든 항목에 대해 익명 개체를 만드는 이유는 무엇입니까?

다음과 같이 간단히 사용할 IDictionary<string, string> dic = db.Table.ToDictionary(row => row.Key, row => row.Value); 수 있습니다. Table과 ToDictionary () 사이에 AsEnumerable () 호출을 포함해야 할 수도 있습니다. 정확한 db.Table 유형을 모르겠습니다.


또한 첫 번째 샘플을 수정하면 두 번째 루프 변수가 선언 및 사용에서 일치하지 않습니다.


2
ToDictionary인 메모리 이기 때문 입니다. 익명 개체를 만들지 않음은 필요한 열만이 아니라 데이터베이스에서 모든 열을 검색한다는 것을 의미합니다.
user247702

ToDictionary기본 구조에 대해 알지 못합니다. 키와 값에 대해 두 개의 콜백 만 호출하므로 (이 경우 람다를 선택하는 간단한 속성)이 ToDictionary호출은 그가 제공 한 예제의 foreach와 기능적으로 동일해야합니다. 내가 아는 한 모든 LINQ 메서드가 지연되므로 콜백은 필요할 때만 호출됩니다.
TWiStErRob

3
SQL Server Profiler를 살펴보면 익명 개체를 사용하면 두 개의 열만 선택되고 선택되지 않은 경우 모든 열이 선택되는 것을 볼 수 있습니다.
user247702
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.