C# SQLite net TableQuery<;T>;。Select()性能差
请进一步考虑下面的完整代码块,特别是这一部分——对象初始化(这就是您所说的吗?): 有没有办法把这些代码抽象成一种我可以重用的方法,而不是将对象初始化代码复制粘贴到每个查询中?我的强烈偏好是性能最好的代码,而不是最容易维护的代码(但显然,易于维护是可取的)C# SQLite net TableQuery<;T>;。Select()性能差,c#,performance,linq,sqlite-net,C#,Performance,Linq,Sqlite Net,请进一步考虑下面的完整代码块,特别是这一部分——对象初始化(这就是您所说的吗?): 有没有办法把这些代码抽象成一种我可以重用的方法,而不是将对象初始化代码复制粘贴到每个查询中?我的强烈偏好是性能最好的代码,而不是最容易维护的代码(但显然,易于维护是可取的) 公共静态列表最近绘制的文件(int-take) { 如果(takef.WhenCrawled.Take(Take).ToList(); 列表=(从conn.Table()中的p选择new LocalFileInfo(){ IsFavorite
公共静态列表最近绘制的文件(int-take)
{
如果(take<1)take=1;
列表=新列表();
使用(SQLite.Net.SQLiteConnection conn=new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(),sqliteDb))
{
//工作正常,但速度较慢。
//list=(从conn.Table()中的p选择p).OrderBy(f=>f.WhenCrawled.Take(Take).ToList();
列表=(从conn.Table()中的p选择new LocalFileInfo(){
IsFavorite=p.IsFavorite,
LastModified=p.LastModified,
名称=p.名称,
ParentFolder=p.ParentFolder,
路径=p.路径,
尺寸=p.尺寸,
SourceId=p.SourceId,
SourceName=p.SourceName,
SourceType=p.SourceType,
WhenCrawled=p.WhenCrawled
})
.OrderByDescending(f=>f.WhenCrawled)
.拿(拿)
.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
})
list=(从conn.Table()中的p选择new LocalFileInfo(){
IsFavorite=p.IsFavorite,
LastModified=p.LastModified,
名称=p.名称,
ParentFolder=p.ParentFolder,
路径=p.路径,
尺寸=p.尺寸,
SourceId=p.SourceId,
SourceName=p.SourceName,
SourceType=p.SourceType,
WhenCrawled=p.WhenCrawled
})
那么:
list = conn.Table<LocalFileInfo>()
list=conn.Table()
只要将所有特性投影到同一对象类型中,这种方法就有效。如果其中任何一个都不是真的,那么你可以像这样把它抽象出来:
public static class FromObjectExtensions
{
public static IEnumerable<ToObject> ToToObject(this IEnumerable<FromObject> q)
{
return q.Select(t=>new ToObject
{
Property1=t.Property1,
...
};
}
}
list = conn.Table<LocalFileInfo>().ToToObject();
来自ObjectExtensions的公共静态类
{
公共静态IEnumerable ToToObject(此IEnumerable q)
{
返回q.Select(t=>newtoobject
{
属性1=t.属性1,
...
};
}
}
然后你可以这样称呼它:
public static class FromObjectExtensions
{
public static IEnumerable<ToObject> ToToObject(this IEnumerable<FromObject> q)
{
return q.Select(t=>new ToObject
{
Property1=t.Property1,
...
};
}
}
list = conn.Table<LocalFileInfo>().ToToObject();
list=conn.Table().ToToObject();
只需将ToObject
和FromObject
替换为实际的对象类型,并填写要复制的属性。而不是
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
})
list=(从conn.Table()中的p选择new LocalFileInfo(){
IsFavorite=p.IsFavorite,
LastModified=p.LastModified,
名称=p.名称,
ParentFolder=p.ParentFolder,
路径=p.路径,
尺寸=p.尺寸,
SourceId=p.SourceId,
SourceName=p.SourceName,
SourceType=p.SourceType,
WhenCrawled=p.WhenCrawled
})
那么:
list = conn.Table<LocalFileInfo>()
list=conn.Table()
只要您将所有属性投影到同一对象类型中,这一点就行了。如果其中一个不是真的,那么您可以像这样将其抽象出来:
public static class FromObjectExtensions
{
public static IEnumerable<ToObject> ToToObject(this IEnumerable<FromObject> q)
{
return q.Select(t=>new ToObject
{
Property1=t.Property1,
...
};
}
}
list = conn.Table<LocalFileInfo>().ToToObject();
来自ObjectExtensions的公共静态类
{
公共静态IEnumerable ToToObject(此IEnumerable q)
{
返回q.Select(t=>newtoobject
{
属性1=t.属性1,
...
};
}
}
然后你可以这样称呼它:
public static class FromObjectExtensions
{
public static IEnumerable<ToObject> ToToObject(this IEnumerable<FromObject> q)
{
return q.Select(t=>new ToObject
{
Property1=t.Property1,
...
};
}
}
list = conn.Table<LocalFileInfo>().ToToObject();
list=conn.Table().ToToObject();
只需将ToObject
和FromObject
替换为实际的对象类型,并填写要复制的属性即可。这将很有效
using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), sqliteDb))
{
var list = conn.Table<LocalFileInfo>().OrderByDesending(f=>f.WhenCrawled).Take(take).ToList();
};
使用(SQLite.Net.SQLiteConnection conn=new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(),sqliteDb))
{
var list=conn.Table().OrderByDesending(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
})
list=(从conn.Table()中的p选择new LocalFileInfo(){
IsFavorite=p.IsFavorite,
LastModified=p.LastModified,
名称=p.名称,
ParentFolder=p.ParentFolder,
路径=p.路径,
尺寸=p.尺寸,
SourceId=p.SourceId,
SourceName=p.SourceName,
SourceType=p.SourceType,
WhenCrawled=p.WhenCrawled
})
因为这是Linq,您第一次收集对象,并重新创建一个已声明对象的新实例。这毫无意义,而且效率很低。这会很好
using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), sqliteDb))
{
var list = conn.Table<LocalFileInfo>().OrderByDesending(f=>f.WhenCrawled).Take(take).ToList();
};
使用(SQLite.Net.SQLiteConnection conn=new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(),sqliteDb))
{
var list=conn.Table().OrderByDesending(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
})
list=(从conn.Table()中的p选择new LocalFileInfo(){
IsFavorite=p.IsFavorite,
LastModified=p.LastModified,
名称=p.名称,
ParentFolder=p.ParentFolder,
路径=p.路径,
尺寸=p.尺寸,
SourceId=p.SourceId,
SourceName=p.SourceName,
SourceType=p.SourceType,
WhenCrawled=p.WhenCrawled
})
因为这是Linq,您第一次收集对象并重新创建已声明对象的新实例。这毫无意义,而且效率极低。您需要为选择器定义一个
表达式:
public static Expression<Func<LocalFileInfo, LocalFileInfo>> MyLocalFileInfoSelector =
p => 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
};
公共静态表达式