【问题标题】:Fastest Way to extract from SQL Lite in C#在 C# 中从 SQLite 中提取的最快方法
【发布时间】:2026-01-29 07:05:01
【问题描述】:

我们有一个包含大约一百万条记录的表(25 列 int、text 和 datetime),我们需要从 SQL Lite 数据库中提取它们,然后渲染到 wpf xamDataGrid,最快的方法是什么在 C# 中?

另外,最有效的方法是什么?

我们考虑过的选项:

  • 获取数据集

  • 实体列表

  • 数据读取器

  • CSV 数组

提前致谢。

【问题讨论】:

    标签: .net wpf database c#-4.0


    【解决方案1】:

    您可以使用后台线程加载数据并使用主线程的 Dispatcher 填充 ObservableCollection,优先级为 ContextIdle。

    Dispatcher UIDispatcher = Dispatcher.CurrentDispatcher;
    BackgroundWorker bw = new BackgroundWorker();
    bw.DoWork += (sender,e) =>
    {
        // Use a linq query to yield an IQueryable/IEnumerable List of data from DB
        foreach(Data data in DataList)   // Enumerated here
        {
            UIDispatcher.Invoke(DispatcherPriority.ContextIdle, new Action(() => 
            { 
                myOC.Add(data);
            }));
        }    
    };
    

    【讨论】:

    • 这听起来是一个非常好的方法。我会带着测试结果回来。
    • 使用该方法我收到以下错误:XamDataGrid 不支持从与其 Dispatcher 线程不同的线程对其 DataSource 的更改(INotifyPropertyChanged.PropertyChanged 或 ListChangedType.ItemChanged 除外)。
    • @Bongo Sharp: Dispatcher UIDispatcher = Dispatcher.CurrentDispatcher; 确保这一行在主线程中。
    【解决方案2】:

    DataReader 通常是连接 sql 数据库的最快方法。您可以读入它们并将它们手动解析为您自己的自定义对象集合。

    Entity Framework 将为您提供应用程序方面的最佳开发体验和最佳建模抽象级别,但会影响性能。实体可以很好地轻松绑定到 WPF UI 元素。

    DataSet 很容易设置,但会以一种非常丑陋的方式强制将关系数据库抽象到您的应用程序代码中。它将迫使您以非类型安全的方式将列作为字符串引用,这种方式只会在运行时中断,并且通常很脆弱,不再推荐用于任何重要项目。 (在 DataSet 粉丝跳到我的喉咙之前,这是来自 MSFT ecn.channel9.msdn.com/o9/te/NorthAmerica/2010/pptx/DEV324.pptx 的官方指导)

    CSV 数组可能很快,但使用和实施起来要困难得多。

    如果您需要最高性能,请使用 DataReader,但如果您需要开发人员的生产力,请使用 Entity Framework。

    【讨论】:

    • 将 ObservableCollection 发送到 DAL 并使用 DataReader 填充它是否是一种好方法?理论上,它会在填充记录时刷新视图。我现在无法访问 IDE,但我猜在读取记录的过程中它会冻结窗口,因为它仍在同一个线程上运行
    • SQLite ADO.NET 提供程序是否支持 EF?没想到
    • 我不确定实体框架。我很确定您可以手动为 linq-to-sql 进行映射