首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQLiteNet指数与Lambda表达式

SQLiteNet指数与Lambda表达式
EN

Stack Overflow用户
提问于 2013-09-18 22:30:00
回答 2查看 814关注 0票数 2

我们使用Xamarin和SQLiteNet作为ORM。

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

代码语言:javascript
运行
复制
filter = ri => ri.ItemVersioniId == itemVersionId; 

该方法是获取与Id匹配的记录。如果lambda表达式是硬编码的,而不是使用"filter“参数,则要快得多.尽管这是同样的逻辑。

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

代码语言:javascript
运行
复制
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);
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-18 22:38:36

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

代码语言:javascript
运行
复制
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();
}
票数 2
EN

Stack Overflow用户

发布于 2013-09-18 22:53:15

我建议对它进行硬编码。这里是为什么,但首先让我说,我是猜测-我没有经验的SQLiteNet -这是基于一些基本的知识,LINQ如何工作。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18883399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档