1

SQLITE で LINQ によって処理されたくない式があります。

SQLLite 3.8.3.1 を使用する SQLite-net 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() によって、実行しようとしているものが表示されます。

(ところで: 2 つの異なる LINQ 式を作成することで、これを回避できることはわかっています。ただし、より多くの順列 (チェックするフィールド) が増えるため、8-16 は必要ありません。維持する必要があるクエリ - SQL エンジンで作業を行いたい)

4

1 に答える 1

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' を where の中に入れる必要があるのはなぜですか? これは変数ではないため、クエリを分割できます。あなたの場所を2つの場所に分割するだけです。パフォーマンスについて心配する必要はありません。オンデマンドでのみアクティブ化され、個別にはアクティブ化されません。次のようなものです。

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に関しては、それを見ることができません。

于 2014-03-19T11:31:28.410 に答える