Отношения EF и образец спецификации - PullRequest
0 голосов
/ 28 марта 2011

Я искал шаблон спецификации для своих репозиториев, я использую EF4 внутри своих репозиториев, чтобы запрашивать базу данных и отображать выбранные объекты, передавая выражение, что-то вроде этого: -

public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
{
    return _objectSet.Where<TEntity>(predicate);
}

Это работает нормально, если вы просто работаете с одним набором объектов, но скажите, хотите ли вы выбрать все комментарии, сделанные пользователем, которые превышают 128 символов, и пользователь активен. Как бы вы создали спецификацию при использовании двух или более наборов объектов?

Пример: -

class User
{
    public string Name { get; set; }
    public bool Active { get; set; }
    public virtual ICollection<Post> Posts { get; set; }

    public User()
    {
        Posts = new List<Post>();
    }
}

class Post
{
    public string Text { get; set; }
    public DateTime Created { get; set; }
    public virtual ICollection<Comment> Comments { get; set; }

    public Post()
    {
        Comments = new List<Comment>();
    }
}

class Comment
{
    public string Text { get; set; }
    public DateTime Created { get; set; }
}

Для этого в Linq есть: -

* * 1010

Как бы вы преобразовали это в спецификационный класс? Может быть, я просто не вижу что-то, что кажется разумным:)

EDIT

Спецификация интерфейса:

public interface ISpecification<TEntity>
{
    bool IsSatisfiedBy(TEntity entity);
}

Ответы [ 2 ]

1 голос
/ 28 марта 2011

Прежде всего ваша текущая настройка не разрешает такой запрос, потому что User и Comment не связаны.Вы можете выбрать только все комментарии, относящиеся к постам, связанным с пользователем, но вы не знаете, кто оставил комментарии.

Просто добавьте связь между User и Comment, и вы можете просто использовать:

var results = from c in context.Comments
              where c.User.Active and c.Text.Length > 128
              select c;

Это будет легко возможно в вашей спецификации.В любом случае, если вы хотите построить сложное условие из Comment в вашем методе Find, вы должны предоставить свойства навигации, чтобы это разрешить.

0 голосов
/ 28 марта 2011

Забавно. Я только что читал об OCP (Open Closed Principle) и шаблоне спецификации, и мне было интересно, стоит ли на самом деле применять шаблон спецификации в моем проекте.Я просто волнуюсь, что могу получить огромную кучу спецификаций из-за того, что у меня есть несколько сущностей, и я делаю запросы по нескольким критериям.

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

Entity Framework 4 POCO, репозиторий и шаблон спецификации

шаблон спецификации вEntity Framework 4 Revisited

...