gpt4 book ai didi

c# - 在不同存储库中共享类似的 linq to 实体表达逻辑的建议做法是什么

转载 作者:行者123 更新时间:2023-12-02 00:37:02 24 4
gpt4 key购买 nike

使用存储库模式时,有时不同存储库中会出现相同的逻辑。在下面的示例中,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();
}
}

最佳答案

罗林提出的解决方案可行。另一个解决方案是提供通过 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();

关于c# - 在不同存储库中共享类似的 linq to 实体表达逻辑的建议做法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12969987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com