Фильтрация данных DbContext динамически, данных, вводимых пользователем в WPF приложения


Мне нужно для фильтрации данных в базе данных с помощью фильтров доступны конечному пользователю в виде срочных текстовое поле поиска, выберите ящики и т. д.

Я поставил вместе этот код и нужна обратная связь, если это хороший способ сделать это, или если есть какие-то лучшие решения.

using Multi.Model;
using System;
using System.Linq;
using System.Windows.Controls;

namespace Multi.Pages
{
    /// <summary>
    /// Interaction logic for Page1.xaml
    /// </summary>
    public partial class Page1 : Page
    {

        public Page1()
        {
            InitializeComponent();
            textBoxName.TextChanged += TextBoxName_TextChanged;
            PopulateDataGrid();
        }

        private void PopulateDataGrid()
        {
            using (var db = new optisysEntities())
            {
                var items = db.clients.AsQueryable();
                items = FilterClients(db, items);
                dataGrid.ItemsSource = items.ToList();
            }
        }

        private System.Linq.IQueryable<Multi.Model.clients> FilterClients(optisysEntities db, System.Linq.IQueryable<Multi.Model.clients> clients)
        {

            if (!String.IsNullOrWhiteSpace(textBoxName.Text)) clients = db.clients.Where(c => c.name.Contains(textBoxName.Text)
                                                                                  || c.phone.Contains(textBoxName.Text));
            // if (!String.IsNullOrWhiteSpace(search.Email)) clients = clients.Where(u => u.Email.Contains(search.Email));
            // if (search.UsertypeId.HasValue) clients = clients.Where(u => u.UsertypeId == search.UsertypeId.Value);
            return clients;
        }

        private void TextBoxName_TextChanged(object sender, TextChangedEventArgs e)
        {
            PopulateDataGrid();
        }

    }
}


183
0
задан 15 апреля 2018 в 07:04 Источник Поделиться
Комментарии
1 ответ

Сокращения ваш код, как я считаю, является основной ваш вопрос:

private System.Linq.IQueryable<Multi.Model.clients> FilterClients(optisysEntities db, System.Linq.IQueryable<Multi.Model.clients> clients)
{

if (!String.IsNullOrWhiteSpace(textBoxName.Text))
clients = db.clients.Where(c => c.name.Contains(textBoxName.Text) || c.phone.Contains(textBoxName.Text));

if (!String.IsNullOrWhiteSpace(search.Email))
clients = clients.Where(u => u.Email.Contains(search.Email));

if (search.UsertypeId.HasValue)
clients = clients.Where(u => u.UsertypeId == search.UsertypeId.Value);

return clients;
}

Да, это один из лучших способов сделать динамическую фильтрацию.


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

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

Однако, мне кажется, что это приложение либо крошечные, либо только разрабатываются. Поэтому я могу понять, что это абстракция-это нечто на более позднем этапе. Я бы посоветовал делать это сразу, чтобы сделать его в будущем менее болезненно, но это ваш выбор.

2
ответ дан 16 апреля 2018 в 01:04 Источник Поделиться