Запросы в Entity Framework 4, проблема с запросом методов - PullRequest
0 голосов
/ 06 мая 2011

У меня есть небольшое недоразумение, и я надеюсь, что вы можете прояснить это для меня. у меня есть таблица под названием: Запросы.

Я хочу сделать запрос, скажем, по идентификатору запроса, но он не работает.

public Requests SearchById(int id)
{
    Model.ModelContainer cont = new Model.ModelContainer();
    return (cont.Requests.Where(req => req.ReqId == id));
    //when i try to cast to Request i get an error too
}

Я нашел пример, который эта строка должна работать:

cont.Requests.First(req => req.ReqId == id)

но я получаю ошибку во время компиляции, что она не может содержать лямбда-выражение.

У меня есть несколько вопросов:

  1. Как я могу обработать верхний пример? (Запрос от сущности)
  2. Как мне работать с многострочными результатами, кроме преобразования в список
  3. Мне нужно создать расширенный поиск (у меня 6-7 столбцов), есть ли общий способ сделать это?

спасибо !!

Ответы [ 2 ]

1 голос
/ 06 мая 2011

Ваша проблема в том, что Where возвращает коллекцию объектов (от нуля до многих).Вы хотите только один объект.Вы не можете просто привести коллекцию объектов к одному объекту.

Вместо этого вы должны получить First (или если вы знаете, что определенно будет только один, вы можете позвонить Single).

Относительно 2 - это зависит от того, что вы хотите сделать,Вы можете сделать foreach над набором результатов или выбрать из набора результатов перед тем, как поместить его в список, но иногда наиболее эффективным вариантом является сначала поместить в список.

И в пункте 3 существует множествошаблоны доступны.Опять же, это зависит от того, что вы делаете и как работают «поисковые термины».Например,

public List<Requests> SearchById(int? id, DateTime? date, string name)
{
    var cont = new Model.ModelContainer();
    var query = cont.Requests;

    if (id != null)
        query = query.Where(req => req.ReqId == id.Value);

    if (date != null)
        query = query.Where(req => req.Date == date.Value);

    if (!String.IsNullOrEmpty(name))
        query = query.Where(req => req.Name == name);

    return query.ToList();
}
1 голос
/ 06 мая 2011

Это должно работать:

public Request SearchById(int id)
        {
           using(Model.ModelContainer cont = new Model.ModelContainer())
           {
                return cont.Requests.Where(req => req.ReqId == id).FirstOrDefault();
           }
        }

То, что у вас было IEnumerable<Request>, а не один запрос.Также убедитесь, что в вашем кодовом файле есть

using System.Linq;

.Также всегда используйте контекст, когда вы можете использовать using блок.

cont.Requests.First(req => req.ReqId == id)

Это также должно работать - убедитесь, что у вас есть using System.Linq в вашем файле кода.

Как я могу работать с многострочными результатами, кроме преобразования в список

Поскольку ваш контекст является локальным и недоступным вне вашего метода (он впоследствии удаляется), список - ваш лучший вариант.Если вы сохраняете его IQueryable, тогда вы еще не получили результаты из БД, вы только что определили свой запрос, это приводит к проблеме, когда потребитель получает результаты, поскольку только после этого выполняется запрос БД -но соответствующий контекст БД мог быть уже удален.Добавьте .ToList() в конце вашего запроса, чтобы материализовать IQuerable<T>

Мне нужно создать расширенный поиск (у меня 6-7 столбцов), есть ли общий способ сделать это?

Вы можете объединить несколько предложений в методе расширения .Where (), например, Where( x=> x.A=="foo" && x.B == 42).При необходимости вы также можете объединить несколько Where() методов.

...