EF, всместо одной записи извлекаются все
От: Аноним  
Дата: 28.01.11 15:51
Оценка:
Проблема: из базы вместо одной записи извлекаются ВСЕ.

У меня есть общий класс репозитория

public class Repository<T> : IRepository<T> where T : class
    {
        MyDataContext context; // наследник ObjectContext
        ObjectSet<T> objectSet;

        public Repository(MyDataContext context, ObjectSet<T> objectSet) // ctor
        {
            // validate 
            if (context == null) throw new ArgumentNullException("context");
            if (objectSet == null) throw new ArgumentNullException("objectSet");

            this.context = context;
            this.objectSet = objectSet;
        }

        public ObjectSet<T> ObjectSet {
            get { return objectSet; }
        }

        public IEnumerable<T> GetAll() {
           return objectSet.ToList();
        }

        public IEnumerable<T> Find(Func<T, bool> where) {
            return objectSet.Where<T>(where);
        }

        public T Single(Func<T, bool> where) {
            return objectSet.Where(where).Single(); // .Single<T>(where);
        }

...


Вот конкретная реализация этого класса

public class PersonRepository : Repository<Person>
    {
        MyDataContext context;

        public PersonRepository(MyDataContext context) : base(context, context.PersonSet) // ctor
        {
            // validate 
            if (context == null) throw new ArgumentNullException("context");

            this.context = context;
        }


Я это дело использую так:

using (MyDataContext ctx = ... create new contex object ...) {
     // 1
                PersonRepository rep = new PersonRepository (ctx);
                Person p = rep.Single(x => x.ID == id);
     // 2
                Person p = ctx.PersonSet.Where(x => x.ID == id).Single();
}


Так вот разница в использовании этих двух методов огромна!!!
Во втором случае извлекается из базы одна персона,
а в первом звлекаются !!!ВСЕ!!! значения из базы, и затем из выбранного множества извлекается одна персона.

Почему? не нужно поведение как во втром случаеё
Re: EF, всместо одной записи извлекаются все
От: Lloyd Россия  
Дата: 28.01.11 15:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Почему?


Потому что матчасть учить все равно надо, даже если кажется, что все и так просто.

А>не нужно поведение как во втром случаеё


Замени Func<T, bool> на Expression<Func<T, bool>>.
Re[2]: EF, всместо одной записи извлекаются все
От: Аноним  
Дата: 28.01.11 16:16
Оценка:
L>Потому что матчасть учить все равно надо, даже если кажется, что все и так просто.

А>>не нужно поведение как во втром случаеё


L>Замени Func<T, bool> на Expression<Func<T, bool>>.


Да, это оно. Спасибо. Теперь другая проблема: некоторые выражения не конвертируются в EF-опросы.
Например такое "String.IsNullOrWhiteSpace(bla)" выдает ошибку
Сейчас попробую перестроить свои выражения без их использования, но может быть есть какой-то рецепт?
Re[3]: EF, всместо одной записи извлекаются все
От: Lloyd Россия  
Дата: 28.01.11 16:33
Оценка:
Здравствуйте, Аноним, Вы писали:

L>>Замени Func<T, bool> на Expression<Func<T, bool>>.


А>Да, это оно. Спасибо. Теперь другая проблема: некоторые выражения не конвертируются в EF-опросы.

А>Например такое "String.IsNullOrWhiteSpace(bla)" выдает ошибку
А>Сейчас попробую перестроить свои выражения без их использования, но может быть есть какой-то рецепт?

Не знаю как в EF, но в Linq2Sql-е есть возможность использовать в запросах sql-функции. Можешь попробовать покопать в этом направлении.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.