¿Cómo implementar el método FindAll () del repositorio?

Tengo el siguiente patrón de repositorio. El requisito es "Buscar todas las cuentas cuyo nombre de propietario es Lijo". Por lo tanto, necesito escribir una función FindAll. ¿Cómo escribir esta función?

Las restricciones son:

1) El cliente "BankAccountService" no debe usar clases de 'DBML_Project'.

2) NO debemos usar el método GetAll para retirar una lista completa de cuentas y luego hacer un filtro.

Nota: me enfrenté a este problema mientras trabajaba en la preguntaPolimorfismo: ¿la entidad ORM es una entidad de dominio o entidad de datos?

CÓDIGO

namespace ApplicationService_Bank
{
public class BankAccountService
{
    RepositoryLayer.ILijosBankRepository accountRepository = new RepositoryLayer.LijosSimpleBankRepository();

    public void FreezeAllAccountsForUser(string userName)
    {
        //Should not use assembly 'DBML_Project'.

        IEnumerable<DomainEntitiesForBank.IBankAccount> accountsForUserWithNameLIJO = null;
        //accountsForUserWithNameLIJO = accountRepository.FindAll(p => p.BankUser.Name == "Lijo");
    }

}

}


namespace RepositoryLayer
{
public interface ILijosBankRepository
{
    List<DomainEntitiesForBank.IBankAccount> GetAll();
    IEnumerable<DBML_Project.BankAccount> FindAll(System.Func<DBML_Project.BankAccount, bool> predicate);
    void SubmitChanges();
        }

public class LijosSimpleBankRepository : ILijosBankRepository
{

    private IBankAccountFactory bankFactory = new MySimpleBankAccountFactory();
    public System.Data.Linq.DataContext Context
    {
        get;
        set;
    }

    public virtual List<DomainEntitiesForBank.IBankAccount> GetAll()
    {

        List<DBML_Project.BankAccount> allItems = Context.GetTable<DBML_Project.BankAccount>().ToList();
        List<DomainEntitiesForBank.IBankAccount> bankAccounts = new List<DomainEntitiesForBank.IBankAccount>();
        foreach (DBML_Project.BankAccount acc in allItems)
        {
            DomainEntitiesForBank.IBankAccount theAccount = bankFactory.CreateAccount(acc.AccountType, acc.BankAccountID, acc.Status, acc.OpenedDate, acc.AccountOwnerID);
            bankAccounts.Add(theAccount);
        }
        return bankAccounts;
    }


    public IEnumerable<DBML_Project.BankAccount> FindAll(System.Func<DBML_Project.BankAccount, bool> predicate)
    {
        //Where
        var results = Context.GetTable<DBML_Project.BankAccount>().Where(predicate);
        return results;
    }

    public virtual void SubmitChanges()
    {
        Context.SubmitChanges();
    }

}

}

LEYENDO:

Devolviendo IEnumerable <T> frente a IQueryable <T>

¿Cómo diseñar un patrón de Repository para que sea más fácil cambiar a otro ORM más tarde?

Respuestas a la pregunta(1)

Su respuesta a la pregunta