2

Xamarin と SQLiteNet を ORM として使用しています。

データ層クラスには、以下のメソッドがあります。

filter = ri => ri.ItemVersioniId == itemVersionId; 

メソッドは、Id に一致するレコードを取得しています。ラムダ式がハードコードされている場合、「フィルター」パラメーターを使用する代わりに、同じロジックであってもはるかに高速です。

フィルターをパラメーターとして渡すことができますが、それでも良好なパフォーマンスが得られます。何かアドバイスはありますか?

public virtual List<ResourceItem> GetResourceItems (string itemVersionId, Func<ResourceItem,bool> filter ){

        //var t = db.Table<ResourceItem> ().Where (ri => ri.ItemVersionId == itemVersionId); --* this line is 10 times faster

        var t = db.Table<ResourceItem> ().Where (filter); --* this line is 10 times slower

        return new List<ResourceItem> (t);
    }
4

2 に答える 2

2

具体的なのでよくわかりませんが、の代わりにxamarin使用することをお勧めします。ExpressionFunc

Expression<Func<ResourceItem,bool>> filter =
              ri => ri.ItemVersioniId == itemVersionId; 

public virtual List<ResourceItem> GetResourceItems
         (string itemVersionId, Expression<Func<ResourceItem,bool>> filter )
{
    return db.Table<ResourceItem> ().Where (filter).ToList();
}
于 2013-09-18T22:38:36.543 に答える
0

ハードコーディングすることをお勧めします。これが理由ですが、最初に、私が推測していると言ってこれを限定させてください-私はSQLiteNetの経験がありません-これは、LINQ Prodiversがどのように機能するかに関する一般的で初歩的な知識に基づいています.

ハードコーディングすると、ラムダ式はコンパイル時に SQL に変換されます。デリゲートに設定すると、LINQ to Objects クエリになる可能性があります。LINQ プロバイダーがそれを SQL ステートメントに変換できることをコンパイル時に知る方法はありません。代わりに、この作業は実行時に行われるため、パフォーマンスが大幅に低下します。

于 2013-09-18T22:53:15.827 に答える