2

リポジトリパターンを使用する場合、異なるリポジトリに同じロジックが表示されることがあります。以下の例では、EmployeeRepositoryのGetTempEmployees()とCompanyRepositoryのGetCompaniesWithTemps()の式が同じです。

e.IsTemp && e.IsDeleted == false

私の質問は、この式ロジックの重複を最小限に抑えるために推奨される方法は何ですか。

例えば。

public class Employee
{
    public int EmployeeId { get; set; }
    public bool IsTemp { get; set; }
    public bool IsDeleted { get; set; }
}

public class Company
{
    public int CompanyId { get; set; }
    public bool IsDeleted { get; set; }
    public virtual ICollection<Employee> Employees { get; set; } 

}

public class TestContext : DbContext
{
    public TestContext()
    {
    }
    public DbSet<Employee> Employee { get; set; }
    public DbSet<Company> Company { get; set; }
}


public class EmployeeRepository
{
    private readonly TestContext _context;
    EmployeeRepository(TestContext context)
    {
        _context = context;
    }

    public ICollection<Employee> GetTempEmployees()
    {
        return _context.Employee.Where(e => e.IsTemp && e.IsDeleted==false).ToList();
    }
}

public class CompanyRepository
{
    private readonly TestContext _context;
    CompanyRepository(TestContext context)
    {
        _context = context;
    }

    public ICollection<Company> GetCompaniesWithTemps()
    {
        return _context.Company.Where(c => c.Employees.Any(e => e.IsTemp && e.IsDeleted == false)).ToList();
    }
}
4

2 に答える 2

3

Expressionたとえば、を使用する必要があると思います

static class EmployeeExpressions
{
    public static System.Linq.Expressions.Expression<Func<Employee, bool>>
        IsTempAndNotDeleted = e => e.IsTemp && !e.IsDeleted;
}

その後、次のように使用できます

...
return _context.Employee
    .Where(EmployeeExpressions.IsTempAndNotDeleted)
    .ToList();

...
return _context.Company
    .Where(c => c.Employees.Any(EmployeeExpressions.IsTempAndNotDeleted))
    .ToList();

しかし、私はこれについて少しぼんやりしているので、試してみて、機能するかどうかを確認してください。

于 2012-10-19T08:22:49.010 に答える
3

ローリングによって提案された解決策は機能します。別の解決策は、IQueryables で機能する拡張機能を提供することです。何かのようなもの:

static class PersonSetExtensions
{
    public static IQueryable<Person> WhereTempAndNotDeleted(this IQueryable<Person> set)
    {
        return set.Where(x => x.IsTemp && !x.IsDeleted);
    }
}

コードで次のように使用できます。

return _context.Employee
               .WhereTempAndNotDeleted()
               .ToList();
于 2012-10-19T08:36:08.973 に答える