2011-05-02 5 views
0

SQL Server에 3 개의 열, 도메인, 키 및 값이있는 테이블이 있습니다. 닷넷에서 사용할 수있는 해시로 끝내고 싶습니다. EF 4.0을 사용하고 있습니다. LINQ to hash - 캐스팅 권한을 얻을 수 없습니다!

처음에 나는 시도 :

List<Dictionary<string, string>> myHash = db.Registries 
    .Where(x => x.Domain == "Pricing") 
    .Select(x => new { Key = x.Key, Value = x.Value }); 

불평하는 :

오류 3 암시 'System.Collections.Generic.List>'에 유형 'System.Linq.IQueryable을'변환 할 수 없습니다. 문서 프로젝트 \ 비주얼 스튜디오 2010 \ \ \ 사용자 \ SkillScore \ 웹 사이트 \ 컨트롤러는 HomeController.cs 그렇게 분명히 53 (21) 웹 사이트

유형을 \ ekkis \ 명시 적 변환 C는 (? 당신이 캐스트를 누락) 존재 선택을 조정해야합니다. 나는 30 분 (나는 너무 쓸모가 없어!) 일을하지 않고 그것을 망쳤다. (하나님 나는 IRC를 놓친다.) 누구 한테 도움이 되니?

List<Dictionary<string, string>> myHash = db.Registries 
              .GroupBy(x => x.Domain) 
              .Select(g => g.ToDictionary(x => x.Key, 
                     x => x.Value)) 
              .ToList() ; 

이 각 도메인에 대해 별도의 사전을 만들고 목록에 그들 모두를두고 : 이것은 당신이 필요처럼

+0

네, 시도 했어요 : .Select (x => (Dictionary ) new {...}) – ekkis

+0

캐스트도 >() 우리가 알고 있듯이 EF 기본 유형 – ekkis

+0

에만 캐스트 할 수 있다고 불평합니다. .Select (x => new Dictionary () {x.Key, x.값}} - 'Add'에 대한 오버로드 메서드가 하나의 인수를 가짐 – ekkis

답변

3

는 소리. 이것은 도메인 이름에 관한 정보를 잃어 버렸기 때문에 완전히 유용하지는 않습니다 - 아마도 Dictionary<string, Dictionary<string,string>>은 원하는 것보다 많을 것입니다 (도메인 이름을 외부 사전의 키로 사용).

직접 ToDictionary()를 사용하여 얻을 수있는 하나의 도메인에 대한 사전 : 당신이 전체 형식을 필요로하는 경우 pricingDictionary 유형 Dictionary<string, string>의 것을

var pricingDictionary = db.Registries 
          .Where(x => x.Domain == "Pricing") 
          .ToDictionary(x => x.Key, 
             x => x.Value); 

주 그래서 당신은 할 수 있습니다 :

Dictionary<string, string> myHash = db.Registries 
             .Where(x => x.Domain == "Pricing") 
             .ToDictionary(x => x.Key, 
                x => x.Value); 
+0

그게 다야! 하나님. 내가 모르기 때문에 그렇게 많은 투쟁. 만 감사합니다. 완벽합니다. – ekkis

0

"LINQ 쿼리에서 사전 사전을 작성하는 방법"에 관심이 있습니다.

은 내 생각에이 아니기 때문에 LINQ-DB가 없기 때문에 IIS가 없기 때문에 IIS가 "정품"이유로 추측 할 수없는 이유 때문에 추측 할 수 없습니다.

이 코드를 수정하여 수정하십시오 (고장난 경우).

using System; 
using System.Collections.Generic; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) { 
      var registries = FetchAllRegistries(); 
      foreach (KeyValuePair<string, Dictionary<string,string>> domain in registries) { 
       Console.WriteLine("Domain: "+domain.Key); 
       foreach (KeyValuePair<string,string> entry in domain.Value) { 
        Console.WriteLine(" "+entry.Key+" "+entry.Value); 
       }     
      } 
     } 

     private static Dictionary<string, Dictionary<string, string>> FetchAllRegistries() { 
      return db.Registries 
       .GroupBy(x => x.Domain) 
       .Select(g => g.ToDictionary(
        d => d.Domain, 
        d => d.ToDictionary(
         kv => kv.Key, 
         kv => kv.Value 
        ) 
       )) 
      ; 
     } 

     private static Dictionary<string, Dictionary<string, string>> FetchRegistry(string domainName) { 
      return db.Registries 
       .Where(x => x.Domain == domainName) 
       .ToDictionary(
        x => x.Key 
        , x => x.Value 
       ); 
     } 

    } 

} 

그리고 용서 : 이러한 쿼리는 LINQ 그것을 면도해야 posteriour가 있다는 sooooo는 추한 것을 내 의견에 신빙성을 추가하고는 뒤로 걸어 가르쳐야한다. 사실 : "장황한"버전은 좀더 자세하게 표현되어 있지만, 좀 더 자명하다. 내 생각으로는 "LINQ는 대단하다. STEEEEEEP 학습 곡선에 수치 스럽다."

그리고, 제발 ... 모두가 펄 스크립트로 돌아갑니다. 아버지 께 축복하십시오. 나는 할 수 없으니 ... 나는 평민을 사랑합니다. 한숨.

건배. 키이스.

+1

laughing ... 나는 결코 70 년대를 떠나지 않았고 새로운 범퍼스를 범퍼의 평화 표시로 운전하는 21 세기 히피족과 같다고 생각한다. 나는 발로 차고 비명을 지르는 새로운 세계로 끌려 가고있다. – ekkis

관련 문제