Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQLite net TableQuery<;T>;。Select()性能差_C#_Performance_Linq_Sqlite Net - Fatal编程技术网

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
        };
公共静态表达式