Вопрос о дизайне слоя данных WPF / LINQ - PullRequest
0 голосов
/ 02 февраля 2009

Я работаю над главой «Привязка данных» в Pro WPF в C # 2008.

У вас есть этот класс:

public class StoreDB
{
    public Contact GetContact(int id) {...}
    public List<Contact> GetContacts() {...}
}

Идея состоит в том, чтобы вызвать эти методы, получив либо Contact, либо List<Contact>, и связать их с соответствующими элементами управления, используя LINQ для последнего метода для фильтрации / сортировки ваших объектов.

Все это имеет смысл.

Однако что происходит, когда у вас есть 100 000 контактов, и вы хотите получить 3 из них? Ваш метод GetContacts() получает 100 000, а ваш LINQ выбирает три из них?

Разве это не супер неэффективно?

Как создаются реальные приложения, чтобы этого избежать?

Ответы [ 4 ]

2 голосов
/ 02 февраля 2009

Я бы порекомендовал дизайн, который не не имеет GetContacts возвращая список . Я не совсем уверен, что вы хотели бы использовать List , потому что возвращаемая вами коллекция является изменчивой. В WPF, если вы действительно хотите непостоянный список элементов, попробуйте ObservableCollection .

Однако я думаю, что лучший интерфейс вернул бы IEnumerable , который является результатом вашего запроса SQL или LINQ. Это обеспечит неизменную коллекцию ваших контактов в подшивке, которую можно легко и просто отфильтровать с помощью LINQ to Objects.

1 голос
/ 02 февраля 2009

Добро пожаловать в мир Linq!

Вы хотите вернуть IQueryable<Contact>:

public class StoreDB
{
    public Contact GetContact(int id) {...}

    // change to this:
    public IQueryable<Contact> GetContacts() {...}
}

Теперь вы можете сказать это без лишних циклов или пропускной способности:

IQueryable<Contact> SerachByFirstName(StoreDB store, string searchParam, int limit) 
{
    return store.GetContacts()
        .Where(c => c.FirstName == searchParam)
        .Take(limit);
}

Фактически, это все равно не отправит запрос в базу данных, если вы не начнете выполнять перечисление по IQueryable. То есть вы все равно можете добавить еще Where() или OrderBy() или что-либо еще, и они будут объединены и отправлены в источник вместе, когда запрос будет окончательно оценен.


Конечно, это не поможет вам привязаться к пользовательскому интерфейсу. Но это сложная проблема. Вы должны либо предоставить базовый EntitySet для WPF, либо использовать архитектуру MVVM (или аналогичную) для разделения доступа к данным и пользовательскому интерфейсу.

1 голос
/ 02 февраля 2009

Так как вы спрашивали, может ли WPF и LINQ ставить в очередь, я подумал, что вы действительно хотели бы взглянуть на какое-нибудь хорошее видеообучение для WPF и LINQ или ADO.net,

это превосходный источник, чтобы начать обучение очень прямо.

Vido Traning WPF

НТН, Eric

1 голос
/ 02 февраля 2009

Я не знаю книгу, которую вы используете, но вопрос здесь в том, какую базу данных вы используете, если в ней SQL, тогда вы можете использовать LINQ to SQL и добавить файл dbml в свой проект через конструктор VS, а затем просто перетащите нужные истории использовать из представления Sever Explorer в dbml, и все ваши классы объектов бизнес будут сгенерированы автоматически.

Оттуда вы можете использовать созданный dataContex и работать с linq для фильтрации результатов перед их извлечением.

То, что вы делали прямо сейчас, - это фильтрация объектов, которые вы выбрали с помощью различных средств.

НТН, Eric

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...