2008-09-27 5 views
2

오늘 Linq와 함께 놀기 시작했고 대답을 찾을 수없는 문제가 발생했습니다. 일부 직원 기록이있는 간단한 SQL Server 데이터베이스를 쿼리했습니다. 필드 중 하나는 성명 (cn)입니다. 첫 번째 공간에서 전체 이름을 나눠서 이름순으로 그룹화하는 것이 흥미로울 것이라고 생각했습니다. 시도해 보았습니다.질문 별 LINQ 그룹

group by person.cn.Split(separators)[0] 

긴 런타임 예외가 발생했습니다 (C++ 템플릿 인스턴스화 오류와 비슷하게 보임).

은 그 때 나는 첫 번째 이름의 몇 글자에 의해 그룹화 시도 :

group by person.cn.Substring(0,5) 

을하고는 잘 작동하지만 난 싶지 것입니다.

  • 왜 첫 번째 예는 두 번째에 가까운 보이는 경우 작동하지 않습니다

    나는 약 두 가지를 궁금하네요? 무대 뒤에서는 SQL 물건 것은 효율적

덕분에 이런 종류의 작업을 수행 할 수있는 좋은 방법입니다 무엇 일어나고 있음을 알고

  • ,

    앤드류

  • +0

    당신은 예외 메시지를 추가 할 수 있을까요? 당신이 그것을 얻을 때 그렇게하는 것이 중요합니다. –

    답변

    2

    분할 SQL로 더 번역이 없습니다.

    그럼 어떻게 분할하지 않고이 문자열 조작을 할 수 있을까요? (테스트되지 않은) 지옥 같은 속임수 :

    string oneSpace = " "; 
    string fiftySpace = "             "; 
    
    var query = 
        from person in db.Persons 
        let lastname = person.cn.Replace(oneSpace, fiftySpace).SubString(0, 50).Trim() 
        group person by lastname into g 
        select new { Key = g.Key, Count = g.Count }; 
    
    1

    SQL에 LINQ는 SQL에 검색어를 번역 표현의 나무를 사용하기 때문에 작동하지 않았다 첫 번째 시도는 이유를. 결과적으로 SQL로 직접 변환 할 수없는 코드는 예외입니다. 여기에는 Split 호출이 포함됩니다.

    1

    고마워요, "트릭"을 시도해 봅니다. 나는 LINQ에 매우 흥미 롭지 만, LINQ 쿼리가 무엇을 번역했는지를 알아야만 숨겨진 신비가 생겨서 효과적으로 사용할 수있는 것처럼 보입니다.

    물론 핵심 문제는 SQL을 잘 모른다는 것이므로 여기서 시작하겠습니다.

    편집 :

    나는 마지막으로 "교체"오늘 시도하고 작동합니다. 그룹화 된 결과를 개수별로 정렬해야하므로 회사의 이름이 파레토가됩니다. 그것은 끔찍하게 느리다. C#으로 모든 것을 선택하고 버킷을 직접 작성하는 것이 훨씬 빠릅니다.

    다시 감사,

    앤드류

    +0

    정말로 .NET 메소드가 SQL로 변환 될 수 있는지를 알아야합니다. 번역 된 방법을 * 알 필요가 없습니다. 그것은 도움이되지만. =) –

    +0

    나는 데이터베이스에 전송되는 내용과 데이터베이스에서 수행 할 작업을 확실하게 파악해야한다고 말합니다. LinqToObjects와 LinqToSql 메서드는 코드의 독자가 쉽게 분리해야합니다 (ToList는 좋은 분리 자입니다). –