2011-05-03 3 views
2

LINQ to SQL과 LINQPad를 사용하여 "동일한"쿼리를 실행하고 있지만 결과 집합이 약간 다르게 나타납니다.LINQ - LINQ to SQL 대 LINQPad의 다른 결과

코드는 내가 각 레코드에 대해 1 초를 얻을 SQL로 LINQ와 동시에

var conn = new SqliteConnection (
      "DbLinqProvider=Sqlite;" + 
      "Data Source=/home/larsenma/database.golden" 
     ); 

Models.Main db = new Models.Main (conn); 

var runSum = 
    from rr in db.Runrecords 
    group rr by rr.RunID into rg   
    select new 
    { 
    LaneCount = rg.Count(), 
    } 

LINQPad 제대로 "LaneCount을"계산이다.

LINQ to SQL DBLinq에 대한 매핑을 생성하기 위해 sqlmetal을 사용했으며 LINQPad는 IQ 드라이버를 사용했습니다. 내 데이터베이스는 SQLite입니다.

나는이 LINQ 물건에 대해 새삼 스럽다.

나는 미니멀 재현 인스턴스 내 쿼리를 단순화했습니다

을 편집합니다. 생성 된 SQL을 디버깅 할 때

SELECT (SELECT COUNT(*)) 
FROM runrecords 
GROUP BY RunID 

두 번째 "COUNT (*)"는 누락 된 항목입니다.

감사합니다.

답변

5

LINQ to SQL이 아닌 DBLinq를 사용하는 것처럼 들립니다. sqlmetal 도구는 엔티티 클래스와 형식화 된 DataContext를 생성합니다. 그러나 DBLinq를 사용하는 경우 실제로는 LINQ를 SQL로 변환하는 DBLinq입니다.

마지막으로 DBLinq (1 년 또는 2 년 전)를 보았을 때 그것은 원시적이었고 일부 기본 쿼리에서도 넘어졌습니다. LINQPad의 IQ 드라이버는 LINQ를 SQL로 변환하는 데 사용할 수있는 가장 정교한 공급자 관련 엔진 인 Matt Warren's IQueryable toolkit을 사용합니다. 또 다른 좋은 엔진은 DevArt의 LINQ Connect 라이브러리입니다. 이것은 최근에 많은 발전을 이룩했으며 SQLite도 지원합니다.

지금 당장 Oracle을 지원하도록 IQ 드라이버를 업데이트하는 중이며 IQueryable 라이브러리 자체에 대한 몇 가지 개선 사항을 게시 할 계획입니다. 이 라이브러리 나 DevArt 라이브러리를 사용해 보시지 않겠습니까?

+0

감사합니다. Joe. 당신이 올바른지. 모노에 포함 된 SQL에 대한 LINQ 구현이 DBLinq라는 것을 알지 못했습니다. 내 질문에 언급 했어야했다. – Mark

+0

IQueryable 툴킷은 오픈 소스이므로 Mono로 컴파일 할 때 성공할 수 있습니다. 어떻게 지내는지 알려줘. –