2

我们使用 Xamarin 和 SQLiteNet 作为 ORM。

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

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

该方法正在获取与 Id 匹配的记录。如果 lambda 表达式是硬编码的,而不是使用“过滤器”参数,它会更快......即使它是相同的逻辑。

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

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特定的,但我建议使用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-18T22:38:36.543 回答
0

我建议对其进行硬编码。这就是原因,但首先让我通过说我在推测来限定这一点——我没有使用 SQLiteNet 的经验——这是基于一些关于 LINQ Prodivers 如何工作的一般、基本知识。

当您对其进行硬编码时,lambda 表达式会在编译时转换为 SQL。当您将其设置为委托时,它可能是 LINQ to Objects 查询,在编译时无法知道您的 LINQ 提供程序可以将其转换为 SQL 语句。相反,这项工作发生在运行时,因此性能受到很大影响。

于 2013-09-18T22:53:15.827 回答