我们使用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);
}发布于 2013-09-18 22:38:36
我不确定,因为它是特定于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();
}发布于 2013-09-18 22:53:15
我建议对它进行硬编码。这里是为什么,但首先让我说,我是猜测-我没有经验的SQLiteNet -这是基于一些基本的知识,LINQ如何工作。
当硬编码时,lambda表达式在编译时被转换为SQL。当您将其设置为委托时,它可能是查询,因此无法在编译时知道LINQ提供程序可以将其转换为SQL语句。相反,这项工作是在运行时进行的,因此性能受到很大影响。
https://stackoverflow.com/questions/18883399
复制相似问题