いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

DevExpress奮闘記-077 (XPO, XtraGrid)(Linq To XPO, XPQuery, EnumerateAsync, 非同期クエリ実行)

XPOまわりで、以下のブログ記事が出ていました。
内容は、次バージョンのSneak Peekです。


上記の記事の内容は、XPOを利用してWCFサービスを作成し、それをSilverlightから
利用するという内容なのですが、コード内にて以下の事を行っていました。

XPQueryのEnumerateAsyncメソッドを利用して、データを非同期で取得してグリッドに設定している。


内容を見ると、普通にWinFormsとかでも利用できるやんって思って
試してみました。これ、何気に便利。


以下サンプルです。
フォームにGridControlを配置しており、ローディング中が分かるように
フォームの真ん中にラベルを貼り付けています。
出来るだけデータは大量にあった方がいいので、DemoCenterのサーバーモード用データベースを
利用しています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.Xpo;
using DevExpress.Xpo.DB;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private Session _session;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Task.Factory.StartNew(() => 
            {
                XpoDefault.DataLayer = XpoDefault.GetDataLayer(
                                            MSSqlConnectionProvider.GetConnectionString(@".\SQLEXPRESS", @"ServerModeGridProjects"),
                                            AutoCreateOption.SchemaAlreadyExists
                                       );

                _session = new Session();
                _session.UpdateSchema(typeof(ServerModeGridProjects.ServerSideGridTest));

                Invoke(new MethodInvoker(BeginInitializeDataSource), null);
            });

            FormClosing += (s1, e1) => 
            { 
                _session.Dispose(); 
            };
        }

        private void BeginInitializeDataSource()
        {
            var xpQuery = new XPQuery<ServerModeGridProjects.ServerSideGridTest>(_session);
            var query   = from    item in xpQuery
                          where   item.Subject.Contains("Main") && item.HasAttachment
                          orderby item.From
                          select  item;

            query.EnumerateAsync(EndInitializeDataSource);
        }

        private void EndInitializeDataSource(IEnumerable<ServerModeGridProjects.ServerSideGridTest> result, Exception ex)
        {
            lblLoading.Visible = false;
            grdMain.DataSource = result;
        }
    }
}


実行すると、最初はローディング状態の表示となります。

この状態は、非同期でデータを取得している最中ですのでUIスレッドは
ブロックされていません。(BeginInitializeDataSource)


データの取得が完了すると、グリッドにデータが表示されます。(EndInitializeDataSource)


サンプルを以下の場所にアップしました。
試してみたい方はどうぞ。


================================

過去の記事については、以下のページからご参照下さい。

いろいろ備忘録日記まとめ
http://sites.google.com/site/gsfzero1/