Entity Framework 4 метод общего списка с фильтрами - PullRequest
1 голос
/ 03 апреля 2011

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

Проблема, с которой я столкнулся, заключается в том, что я сначала использую EF 4 с кодом, и все, что я могу найти, - это использование Linq.запросов, но я не вижу способа построить предложение where для фильтра, исходя из параметров фильтра, выбранных пользователем.то есть в SQL вы могли бы построить,

select * from people, address where lastname = 'jones' and address.city = 'sydney'

Есть ли способ создать этот список динамически с помощью linq?

EDIT Решение, которое я собираюсь попробовать, будет похоже на это Реализация динамического поиска с использованием LINQ .Поскольку я предпочитаю быть настолько универсальным, насколько это возможно.

Ответы [ 3 ]

3 голосов
/ 03 апреля 2011

Способ сделать это, например, определить некоторый тип для критериев поиска:

public class PeopleSearchCriteria
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string City { get; set; }
}

и определить пользовательский метод расширения для IQueryable<Person>:

public static IQueryable<Person> FilterBySearchCriteria(this IQueryable<Person> query, 
     PeoplseSearchCritera criteria)
{
    if (!String.IsNullOrEmpty(criteria.FirstName))
    {
        string firstName = criteria.FirstName;
        query = query.Where(p => p.FirstName == firstName);
    }

    // do similar code for other criterias

    return query;
}

Теперь вам нужно всего лишь создать подшивку модели (или, по возможности, использовать привязку по умолчанию), чтобы заполнить параметры поиска в экземпляре PeopleSearchCriteria и выполнить просто:

var data = context.People.FilterBySearchCriteria(searchCriteria).ToList();

Если вам действительно нужен какой-то динамический подход, вы можете построить дерево выражений вручную или проверить Dynamic Linq (вы потеряете проверки времени компиляции).

0 голосов
/ 03 апреля 2011

Я предлагаю использовать шаблон хранилища для таких вещей

http://msdn.microsoft.com/en-us/library/ff649690.aspx

вот пример;

public class PeopleRepository { 

  HumanEntities _entities = new HumanEntities();

  public IQueryable<people> GetAll() {

    IQueryable<people> query = _entities.Customers;

    retun query;

  }

  public IQueryable<people> GetAll(string _lastname, string _city) {

    //I am thinking that people and address tables are related to each other 
    //as one to many or many to many. So the example should look like below;
    var query = GetAll().Where(x => x.lastname = _lastname && x.address.city = _city); 

    retun query;

  }

  public void Save() { 

    _entities.SaveChages()

  }
}

и после этого вы можете легко использовать их вне своего класса. как ниже;

PeopleRepository _repo = new PeopleRepository();

DataList1.DataSource =  _repo.GetAll("ugurlu", "LA");

Вы упомянули, что вы хотите, чтобы параметры вводились пользователем. Я не знаю, где вы будете использовать свою модель сущности (веб-формы asp.net, формы win или asp.net mvc), но вот пример этого;

PeopleRepository _repo = new PeopleRepository();

DataList1.DataSource =  _repo.GetAll(LastnameTextBox.Text, CityTextBox.Text);
0 голосов
/ 03 апреля 2011

Например:
Это позволяет вам фильтровать людей

var people = EfDBContextEntities.people; // depends on your context and naming

var filteredPeople = 
from p in people
where p.lastname == "jones"
select p;

Если вы хотите вернуть оба объекта в одну коллекцию, вы можете сделать что-то вроде:

var myCollection = 
from p in people
from a in address
where p.lastname == "jones"
where a.city == "sydney"
select new {person = p, address = a};

Вы получите коллекцию объектов и сможете получить к ним доступ, например:

foreach (var item in myCollection)
{
  var personName = item.person.lastname;
  var cityAddress = item.address.city;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...