Возврат доходности на уровне данных - PullRequest
1 голос
/ 14 ноября 2011

У меня есть приложение WPF, которое показывает элементы в DataGrid (XCeed DataGrid). Загрузка приложения занимает некоторое время, когда база данных (SQLite) содержит много элементов, поэтому я хотел бы использовать возвращение доходности, если это возможно, для загрузки по требованию. Я знаю, что XCeed DataGrid поддерживает виртуализацию пользовательского интерфейса , но я не совсем уверен, как преобразовать следующий блок синхронного кода.

В настоящее время список загружен в BackgroundWorker для предотвращения замедления пользовательского интерфейса, заполняется как источник данных сетки.

   public override IList<IRecipe> GetRecipes()
    {
        List<IRecipe> recipes = new List<IRecipe>();
        Execute(conn =>
        {
            using (var cmd = conn.CreateCommand()) {
                cmd.CommandText = "SELECT * FROM recipes  ORDER BY Name";
                var reader = cmd.ExecuteReader();
                while (reader.Read()) {
                    try {
                        var recipe = GetRecipe(reader);
                        recipes.Add(recipe);
                    } catch (Exception ex) {
                        Console.WriteLine(string.Format("Error loading recipe: {0}", ex.Message));
                    }
                }
                reader.Close();

                cmd.CommandText = "SELECT * FROM Ingredients WHERE Recipe = @Recipe";
                cmd.Parameters.AddWithValue("@Recipe", string.Empty);
                foreach (IRecipe recipe in recipes) {
                    cmd.Parameters["@Recipe"].Value = recipe.ID;
                    reader = cmd.ExecuteReader();
                    while (reader.Read()) {
                        try {
                            IIngredient Ingredient = GetIngredient(reader);
                            recipe.Ingredients.Add(Ingredient);
                        } catch (Exception ex) {
                            Console.WriteLine(string.Format("Error adding Ingredient to recipe '{0}': {1}", recipe.Name, ex.Message));
                        }
                    }
                    reader.Close();
                }
            }

В качестве альтернативы, есть ли другой способ улучшить скорость и использовать ленивую загрузку?

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

yield return не ваш друг здесь. Блок итератора (который создает yield return) - это просто синтаксический сахар для создания класса, реализующего IEnumerable, и пользовательского перечислителя, который реализует конечный автомат. На самом деле это не дает никакого выигрыша в производительности и не обязательно облегчает отложенную загрузку, поскольку генерируемый им код будет столь же синхронным, как и код, который вы в нем пишете.

Я не эксперт по сетке Xceed, поэтому я не могу дать вам ответ, относящийся к этому продукту, но ленивая загрузка действительно может помочь с вашей проблемой (для ее истинного решения вам, вероятно, придется чтобы загрузить как можно меньше данных для отображения, а затем начать преимущественную загрузку предстоящих данных в фоновом потоке, но подробности того, как это сделать, выходят за рамки ответа здесь).

Один из подходов может состоять в том, чтобы синхронно загрузить определенное количество строк (все, что необходимо отобразить в данный момент), а затем загрузить остальные строки либо по мере необходимости (если ваш набор данных большой, а пользователь вряд ли будет выглядеть на всех из них) или в фоновом режиме (если набор невелик или пользователь может просмотреть их все).

0 голосов
/ 14 ноября 2011

Я не знаю точно, как xceed выбирает виртуализированные элементы.
Я предполагаю, что это какое-то событие, которое определяет диапазон запрашиваемых строк.

В случае (или любого другого метода, который используется) вы получаете диапазон вашего запроса. Используйте LIMIT и OFFSET, как указано в нижней части SELECT документации .

...