2014-10-13 2 views
1

У меня есть 2 Poco объектов:Добавить условие в списке геттер собственность

public abstract class BasePoco 
{ 
    public int Id { get; set; } 
    public bool IsDeleted { get; set; } 
} 

public class FirstPoco : BasePoco 
{ 
    public virtual List<SecondPoco> SecondPocos { get; set; } 
} 
public class SecondPoco : BasePoco 
{ 
} 

Когда я запрашиваю объект firstPoco из моего репозитория реализации, где Id == 10:

var first = Repository.Get<FirstPoco>(10); 

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

x=>!x.IsDeleted 

Но есть ли способ реализации этого для соответствующей коллекции SecondPoco?

На данный момент я бы написать:

var secondCollection = first.SecondPocoes.Where(x=>!x.IsDeleted); 

Есть ли способ, как сделать это в общем?

EDIT это мой метод Get:

private IQueryable<T> GetQueryable<T>() where T : BasePoco 
{ 
    return _context.Set<T>().AsQueryable().Where(x => !x.IsDeleted); 
} 
public T Get<T>(int id) where T : BasePoco 
{ 
    return GetQueryable<T>().FirstOrDefault(x => x.Id == id); 
} 
+0

Я думаю, вам нужно показать реализацию для вашего метода 'Get'. Скорее всего, там, где вы захотите добавить общую (вероятную абстрактную) логику, всегда использовать «! IsDeleted'. – Yuck

+0

@Yuck см. Вопрос обновлен. Я не думаю, что вы понимаете, чего я пытаюсь достичь здесь. Я не звоню. Введите () для каждого элемента списка SecondPocoes. Метод Get никогда не вызывается для SecondPoco в этом случае –

+2

Возможный дубликат: http://stackoverflow.com/questions/18707139/making-a-global-filter-for-entity-framework – Masoud

ответ

0

Вот что будет иметь смысл для меня. Просто оберните публичную собственность вокруг вашей фактической коллекции.

public class FirstPoco : BasePoco 
{ 
    private virtual List<SecondPoco> _secondPocos; 
    public virtual List<SecondPoco> SecondPocos 
    { 
     get {return _secondPocos.Where(x => !x.IsDeleted);} 
     set { _secondPocos = value;} 
    } 
} 
+0

Является ли это самым общим решением, которое я могу получить? Если у меня есть десятки POCOs, это, похоже, не очень помогает. –

0

Если все они вытекают из того же базового объекта и метод IsDeleted в каждом из них:

public abstract class BasePoco 
{ 
    public int Id { get; set; } 
    public bool IsDeleted { get; set; } 
} 

public class FirstPoco : BasePoco 
{ 
    public virtual List<BasePoco> ChildPocos { get; set; } 
} 

public class SecondPoco : BasePoco 
{ 

} 

var secondCollection = first.ChildPoco.Where(x=>!x.IsDeleted); 

Я не знаю, что вы хотите сделать с ними, но вы могли бы получить все из них с простым вызовом.

public IEnumerable<BasePoco> Build() 
    { 
     var basePoco = typeof (BasePoco); 
     return Assembly.GetExecutingAssembly().GetTypes() 
      .Where(type => entityRule.IsAssignableFrom(type) && type.GetConstructor(Type.EmptyTypes) != null) 
      .Select(Activator.CreateInstance) 
      .Cast<BasePoco>(); 
    } 

Это даст вам список всех классов, которые наследуют от базового Poco и вы могли бы итерацию их, чтобы получить то, что вы хотите.

Смежные вопросы