2011-05-03 53 views
2

我正在執行使用LINQ to SQL和LINQPad的「相同」查詢,但結果集略有不同。LINQ-與LINQ to SQL與LINQPad的不同結果

的代碼是

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中我得到1S每個記錄。

使用LINQ to SQL我使用sqlmetal爲DBLinq生成映射,並且使用LINQPad使用IQ驅動程序。我的數據庫是SQLite。

我對這個LINQ的東西比較陌生,有什麼想法我會錯的?

編輯

我已經簡化我查詢到的極簡重現的實例。當我調試生成的SQL我得到

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

這是第二個「COUNT(*)」是缺少的東西了。

謝謝。

回答

5

這聽起來像你使用DBLinq,而不是LINQ to SQL。 sqlmetal工具生成實體類和類型化的DataContext - 但是如果您使用的是DBLinq,那麼它實際上是將LINQ轉換爲SQL的DBLinq。

當我上次查看DBLinq時(一年或兩年前),這是相當原始的,甚至在一些基本的查詢中都崩潰了。 LINQPad的IQ驅動程序使用Matt Warren's IQueryable toolkit,這可能是用於將LINQ轉換爲SQL的最複雜的與提供程序無關的引擎。另一個很好的引擎是DevArt的LINQ Connect庫 - 這在近期已經走過了很長的路,並且還支持SQLite。

現在我正在更新IQ驅動程序以支持Oracle,並計劃發佈一些對IQueryable庫本身的增強功能。你爲什麼不嘗試使用這個或DevArt的庫。

+0

謝謝喬。你是對的。我沒有意識到mono中包含的LINQ to SQL的實現是DBLinq。應該在我的問題中提到這一點。 – Mark 2011-05-04 13:11:34

+0

IQueryable工具包是開源的,因此您可能已經成功地在Mono中進行編譯。讓我知道你是怎麼辦的。 – 2011-05-04 13:46:44