C# SQLiteNet索引和Lambda表达式

C# SQLiteNet索引和Lambda表达式,c#,sqlite,lambda,xamarin,C#,Sqlite,Lambda,Xamarin,我们使用Xamarin和SQLiteNet作为ORM 在我们的数据层类中,我们有下面的方法 filter = ri => ri.ItemVersioniId == itemVersionId; 方法是获取与Id匹配的记录。如果lambda表达式是硬编码的,而不是使用“filter”参数,则速度要快得多。。。尽管逻辑是一样的 我们希望能够通过过滤器作为一个参数,但仍然获得良好的性能。有什么建议吗 public virtual List<ResourceItem> GetRes

我们使用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);
    }
公共虚拟列表GetResourceItems(字符串itemVersionId,Func筛选器){
//var t=db.Table()。其中(ri=>ri.ItemVersionId==ItemVersionId);--*此行速度快10倍
var t=db.Table()。其中(filter);--*此行速度慢了10倍
返回新列表(t);
}

我不确定,因为它是
xamarin
特定的,但我建议使用
表达式
而不是
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();
}
表达式过滤器=
ri=>ri.itemVersionId==itemVersionId;
公共虚拟列表GetResourceItems
(字符串itemVersionId,表达式筛选器)
{
返回db.Table().Where(filter.ToList();
}

我建议对其进行硬编码。这就是原因,但首先让我证明一下,我在猜测——我没有使用SQLiteNet的经验——这是基于对LINQ Prodiver如何工作的一些一般的、基本的知识


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

其中的SQLite Net函数签名已经是一个表达式:
(expression predExpr)
。。所以它必须是..@SimonWhitehead,但调用方方法签名需要类型为
Func
的参数。我不熟悉“表达式”。。。我想我必须做家庭作业,找出它们的不同之处。谢谢