Проблема: из базы вместо одной записи извлекаются ВСЕ.
У меня есть общий класс репозитория
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();
}
Так вот разница в использовании этих двух методов огромна!!!
Во втором случае извлекается из базы одна персона,
а в первом звлекаются !!!ВСЕ!!! значения из базы, и затем из выбранного множества извлекается одна персона.
Почему? не нужно поведение как во втром случаеё
Здравствуйте, Аноним, Вы писали:
А>Почему?
Потому что матчасть учить все равно надо, даже если кажется, что все и так просто.
А>не нужно поведение как во втром случаеё
Замени Func<T, bool> на Expression<Func<T, bool>>.
L>Потому что матчасть учить все равно надо, даже если кажется, что все и так просто.
А>>не нужно поведение как во втром случаеё
L>Замени Func<T, bool> на Expression<Func<T, bool>>.
Да, это оно. Спасибо. Теперь другая проблема: некоторые выражения не конвертируются в EF-опросы.
Например такое "String.IsNullOrWhiteSpace(bla)" выдает ошибку
Сейчас попробую перестроить свои выражения без их использования, но может быть есть какой-то рецепт?