2014-03-18 38 views
1

我有一個表達式不願意被SQLITE中的LINQ處理。在Windows 8.1上的Sqlite-net Windows應用商店應用程序 - 無法編譯「不」

使用SQLLite 3.8.3.1 使用SQLite網2.1

的表達式是:

int stars = location.MinRating; 
bool onlyLargePhotos = location.OnlyLargePhotos; 

var query = db.MediaItems.Where(x => x.LocationId == location.LocationId && x.Rating >= stars && (!onlyLargePhotos || (onlyLargePhotos && (x.Width >= 2000 || x.Height >= 2000)))); 

這個查詢,訪問時,失敗。它似乎正在絆倒!onlyLargePhotos。

唯一的例外是:

System.NotSupportedException occurred 
    HResult=-2146233067 
    Message=Cannot compile: Not 
    Source=SQLite.Net 
    StackTrace: 
     at SQLite.Net.TableQuery`1.CompileExpr(Expression expr, List`1 queryArgs) 
     at SQLite.Net.TableQuery`1.CompileExpr(Expression expr, List`1 queryArgs) 
     at SQLite.Net.TableQuery`1.CompileExpr(Expression expr, List`1 queryArgs) 
     at SQLite.Net.TableQuery`1.GenerateCommand(String selectionList) 
     at SQLite.Net.TableQuery`1.Count() 
     at SmartFrame.Mosh.DB.WeightedLocationHelper.<>c__DisplayClass9.<CalculateWeightsAsync>b__2(IndexConnection db) 
    InnerException: 

而且 - 誰能告訴我,如果有一種方法,看看有什麼SQL查詢是要執行?在SQL LINQ中,IQueryable的ToString()會告訴你將要執行什麼。 (我知道我可以通過創建兩個不同的LINQ表達式來解決這個問題..但是,我將會有更多的排列 - 我將檢查更多的字段 - 因此,我不想有8-16個我需要維護的查詢 - 我希望工作由SQL引擎完成)

回答

4

.net SQLite包裝並不完美,缺少許多方法和功能。特別是Where子句。它無法編譯某些表達式,所以儘可能簡單地編寫它們。爲此,請嘗試以下操作:

var query = db.MediaItems.Where(x => x.LocationId == location.LocationId && x.Rating >= stars && (onlyLargePhotos == false || (onlyLargePhotos == true && (x.Width >= 2000 || x.Height >= 2000)))); 

順便說一句,爲什麼你需要把變量'onlyLargePhotos'放在哪裏?這不是一個變量,然後查詢可以分開。只需將你的位置分成兩部分即可。不要擔心性能,兩種情況的將被激活,只在求而不得分開,這樣的事情:

Func<MediaItem, bool> func; 
if (onlyLargePhotos) 
{ 
    func = ((x => x.LocationId == location.LocationId && x.Rating >= stars) && ((x.Width >= 2000 || x.Height >= 2000))); 
} 
else 
{ 
    func = (x => x.LocationId == location.LocationId && x.Rating >= stars); 
} 

var query = db.MediaItems.Where(func) 

對於生成的SQL,你看不到它。

+0

正如我在下面寫的 - 我將在那裏有更多的條件。如果我開始分解它們,我需要維護的數量將呈指數級增長(或至少接近指數級增長,因爲它們中的一些將相互排斥)。感謝你的回答。 –

+0

當然,如果你打算增長,解決方案必須進行調整。我不熟悉你的代碼,這就是我提出這個建議的原因。無論如何,希望對你至少有用,因爲你可以告訴你問題是什麼。如有需要,請隨時諮詢。 – Samuelens

相關問題