gpt4 book ai didi

c# - SQLite-net TableQuery.Select() 性能不佳

转载 作者:太空宇宙 更新时间:2023-11-03 18:03:39 31 4
gpt4 key购买 nike

进一步考虑下面的完整代码块,特别是这部分 - 对象初始化(你会这么称呼它吗?):

new LocalFileInfo() {
IsFavorite = p.IsFavorite,
...
WhenCrawled = p.WhenCrawled
}

无论如何,是否可以将此代码抽象为诸如我可以重用的方法之类的东西,而不是将对象初始化代码复制粘贴到每个查询中?我的强烈偏好是性能最好的代码,而不是最容易维护的代码(但显然易于维护是可取的)。
public static List<LocalFileInfo> RecentlyCrawledFiles(int take)
{
if (take < 1) take = 1;

List<LocalFileInfo> list = new List<LocalFileInfo>();

using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), sqliteDb))
{
// works but is slower.
// list = (from p in conn.Table<LocalFileInfo>() select p).OrderBy(f => f.WhenCrawled).Take(take).ToList();

list = (from p in conn.Table<LocalFileInfo>() select new LocalFileInfo() {
IsFavorite = p.IsFavorite,
LastModified = p.LastModified,
Name = p.Name,
ParentFolder = p.ParentFolder,
Path = p.Path,
Size = p.Size,
SourceId = p.SourceId,
SourceName = p.SourceName,
SourceType = p.SourceType,
WhenCrawled = p.WhenCrawled
})
.OrderByDescending(f => f.WhenCrawled)
.Take(take)
.ToList();
};

return list;
}

最佳答案

我在 SQLite-net 中查看了 master 分支的源代码

该库似乎忽略了您的预测,因此我认为对它们进行表达不会有任何帮助

例如见 SqlLite.cs TableQuery<T>类(class)

    public IEnumerator<T> GetEnumerator ()
{
if (!_deferred)
return GenerateCommand("*").ExecuteQuery<T>().GetEnumerator();

return GenerateCommand("*").ExecuteDeferredQuery<T>().GetEnumerator();
}

这个 GetEnumerator()每次执行 ToList() 时都会使用方法或 foreach (var item in query) .
GenerateCommand()将构建 SQL,它“理论上”支持字符串参数 selectList ,但库永远不会使用这个参数

此外,当您执行 Select(Expression)库存储一个 _selector私有(private)属性(property),但绝不会在调用 GenerateCommand() 时使用它,或任何其他调用

This issue has been reported

因此,我认为您对性能的最佳选择是:
var list = conn.Table<LocalFileInfo>()
.OrderByDescending(f => f.WhenCrawled)
.Take(take)
.ToList();

你可以做一个 Select<T>()在此之后,但库已经加载了整个实体列表以及每个属性。但是,如果您保留这些实体,那么事后选择可能会帮助您进行 GC(也就是说, ToList() 之后的投影不会给您带来任何立竿见影的 yield )。

或使用 Query<T>()从连接对象...这将带您回到 SQL 领域。

或者,等待 Entity Framework Core to support Xamarin

Roadmap 中有提及:

Xamarin works in some scenarios but has not been fully tested as a supported scenario.



对不起,但这是我目前能想到的最好的:(

编辑:其实我相信如果你做一个 Select(p => p.IsFavorite)图书馆将惨遭失败,因为它无法映射您的投影(不是抨击图书馆,只是提醒一下)

关于c# - SQLite-net TableQuery<T>.Select() 性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41171829/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com