.Net Entity Framework и POCO запрашивают проблему с полной таблицей

Я пытаюсь реализовать шаблон репозитория с моими объектами poco, автоматически сгенерированными из моего edmx.

В моем классе репозитория у меня есть:

IObjectSet<E> _objectSet;
private IObjectSet<E> objectSet
{
    get
    {
        if (_objectSet == null)
        {
            _objectSet = this._context.CreateObjectSet<E>();
        }
        return _objectSet;
    }
}

public IQueryable<E> GetQuery(Func<E, bool> where)
{
    return objectSet.Where(where).AsQueryable<E>();
}

public IList<E> SelectAll(Func<E, bool> where)
{
    return GetQuery(where).ToList();
}

Где E — один из моих классов POCO. Когда я трассирую базу данных и запускаю это:

IList<Contact> c = contactRepository.SelectAll(r => r.emailAddress == "[email protected]");

Он отображается в трассировке sql как выбор для всего в моей таблице контактов. Где я ошибаюсь? Есть лучший способ сделать это? Разве набор объектов не загружается лениво... поэтому он опустил предложение where? Это статья, которую я прочитал, в которой говорилось об использовании objectSet... поскольку с POCO у меня нет EntityObject для перехода в "E"

http://devtalk.dk/CommentView,guid,b5d9cad2-e155-423b-b66f-7ec287c5cb06.aspx


person Chris Klepeis    schedule 25.05.2010    source источник


Ответы (1)


Используйте Expression<Func<E, bool>> вместо Func<E, bool>. Первый указывает компилятору C# создать дерево выражений (используемое для построения SQL-запроса) вместо фактического кода, а второй — обычный делегат. Это означает, что в настоящее время вы выполняете фильтрацию с помощью Linq to Objects после вызова базы данных.

person Julien Lebosquain    schedule 25.05.2010