我们将Xamarin与SQLiteNet一起用作ORM。

在我们的数据层类中,我们有以下方法。

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


该方法获取与ID匹配的记录。如果lambda表达式是硬编码的,则代替逻辑“ filter”,它会更快……即使它是相同的逻辑。

我们将能够将过滤器作为参数传递,但仍然可以获得良好的性能。有什么建议吗?

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);
    }

最佳答案

我不确定,因为它是xamarin特定的,但我建议使用Expression而不是Func

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();
}

关于c# - SQLiteNet索引和Lambda表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18883399/

10-12 04:48