【问题标题】:How To Force An Entity Framework Query To Run?如何强制实体框架查询运行?
【发布时间】:2015-08-03 22:40:05
【问题描述】:

我正在使用 EF 6 在 WPF DataGrid 中显示数据。数据似乎没有问题。但我调用 FormatGrid 函数来执行诸如用网格标题中的空格替换字段名称中的下划线之类的事情。我第一次运行查询它不起作用。它在 DataGrid 中找不到任何列。但在那之后,当我第二次运行查询时,它会找到我想要的列和格式。我尝试将 LazyLoadingEnabled 设置为 false。我试过在查询结果上调用 Count() 。在第一次通话期间,没有任何内容会填充查询。有什么方法可以强制在 EF 查询中加载列,还是应该在网格中使用以后的事件来格式化数据?

        private void LoadStores()
        {
            dgvStores.ItemsSource = null;
            using (var oContext = new FiduciaEntities())
            {
                oContext.Configuration.LazyLoadingEnabled = false;
                var oQuery = from sd in oContext.StoreDefs
                             where sd.franchise == false
                             orderby sd.store_no
                             select new 
                             {
                                 Store_No = sd.store_no,
                                 Store_Name = sd.store_name,
                                 County = c.County1,
                                 _StoreID = sd.id
                             };

                dgvStores.ItemsSource = oQuery.ToList();
                dgvStores.SelectedValuePath = "_StoreID";
                int iCount = oQuery.Count();
                FormatGrid(ref dgvStores);
            }
        }
        private void FormatGrid(ref DataGrid oDataGrid)
        {
            foreach (DataGridColumn oColumn in oDataGrid.Columns)
            {
                string sHeader = oColumn.Header.ToString();
                if (sHeader.Length > 0)
                {
                    if (sHeader.Substring(0, 1) == "_")
                    {
                        oColumn.Visibility = System.Windows.Visibility.Hidden;
                        oColumn.Header = oColumn.Header.ToString().Replace("_", "");
                    }
                }
                oColumn.Header = oColumn.Header.ToString().Replace("_", " ");
            }
        }

【问题讨论】:

  • 我在 MSDN 上找到了这个页面,它描述了 EF 中的延迟执行:msdn.microsoft.com/en-us/library/vstudio/…。它说当我调用 ToList() 时应该填充查询。我猜问题在于DataGrid。我将 AutoGenerateColumns 设置为 true,但第一次加载网格时它不会自动生成列。我不知道为什么。似乎是因为它位于不同的选项卡中。当我在选项卡上放置一个按钮并从那里运行查询时,它第一次正确加载。这个问题可能没有解决办法。

标签: c# wpf entity-framework datagrid


【解决方案1】:

您没有提到您是否验证了问题是在查询中没有返回数据还是网格根本没有显示它。我会先确定。

如果你调试代码,在行(查询实际运行的地方)放置一个断点:

dgvStores.ItemsSource = oQuery.ToList();

第一次运行后,您是否看到任何返回的数据?

【讨论】:

    【解决方案2】:

    我已经解决了这个问题,但这不是一个优雅的解决方案。如果有人有更好的解决方案,请发布。我将 FormatGrid 代码移至网格加载事件。这似乎行得通。

            private void dgvStores_Loaded(object sender, RoutedEventArgs e)
            {
                if (dgvStores.Columns.Count > 0)
                {
                    DataGrid oDataGrid = (DataGrid)sender;
                    Utilities.FormatGrid(ref oDataGrid);
                }
            }

    【讨论】:

    • jstreet - 既然你提到了它,它看起来确实像你的提议。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多