Entity framework 如何在实体框架中编写通用查询?
我有3个方法这些方法都是相同的,只有一些参数会改变我想写一个方法我怎么写Entity framework 如何在实体框架中编写通用查询?,entity-framework,linq,dbcontext,generic-programming,Entity Framework,Linq,Dbcontext,Generic Programming,我有3个方法这些方法都是相同的,只有一些参数会改变我想写一个方法我怎么写 public string method1(int id) { var getAllStudents = rep.Students.Where(e => e.StudentId == id).ToList(); foreach (var item in getAllStudents) { if (item.isActive
public string method1(int id)
{
var getAllStudents = rep.Students.Where(e => e.StudentId == id).ToList();
foreach (var item in getAllStudents)
{
if (item.isActive != true)
return "Error";
}
return "OK";
}
public string method2(int id)
{
var getAllTeachers = rep.Teachers.Where(e => e.TeacherId == id).ToList();
foreach (var item in getAllTeachers)
{
if (item.isActive != true)
return "Error";
}
return "OK";
}
public string method3(int id)
{
var getAllClasses = rep.Classes.Where(e => e.ClassId == id).ToList();
foreach (var item in getAllClasses)
{
if (item.isActive != true)
return "Error";
}
return "OK";
}
我认为有一种非常简单的方法来编写1方法。think是参数具有不同id的地方。。
谢谢。如果方法的签名相同,则不能重载它们 您有两个具有相同签名的方法:
public string checkexist(int id)
您可以做的是重命名您的方法,如下所示:
public interface WriteSomethingHere {
public boolean isStudentExist(int id);
public boolean isTeacherExist(int id);
public boolean isClassExist(int id);
}
您必须创建枚举
Public Enum ParameterStaus:short
{
Student=1,
Teacher=2,
Classess=3
}
public string method2(int id.ParameterStatus status)
{
if(status==ParameterStatus.Teacher)
{
var getAllTeachers = rep.Teachers.Where(e => e.TeacherId == id).ToList();
foreach (var item in getAllTeachers )
{
if (item.isActive != true)
return "Error";
}
return "OK";
}
}
Else if(status==ParameterStatus.Student)
{
var getAllStudents = rep.Students.Where(e => e.StudentId == id).ToList();
foreach (var item in getAllStudents)
{
if (item.isActive != true)
return "Error";
}
return "OK";
}
Else
{
var getAllClasses = rep.Classes.Where(e => e.ClassId == id).ToList();
foreach (var item in getAllClasses)
{
if (item.isActive != true)
return "Error";
}
return "OK";
}
}
避免基于参数的条件逻辑。这导致了脆弱的代码,因为每个参数组合都必须经过测试才能被认为是可靠的。这会导致复杂的代码很容易出现bug。简单的单一用途方法通常更可靠,更易于理解和维护 例如,给定您的示例并假设“rep”是您实例的DbContext
public bool IsActiveStudent(int id)
{
bool result = rep.Students.Any(x => x.StudentId == id && x.IsActive);
return result;
}
public bool IsActiveTeacher(int id)
{
bool result = rep.Teachers.Any(x => x.TeacherId == id && x.IsActive);
return result;
}
public bool IsActiveClass(int id)
{
bool result = rep.Classes.Any(x => x.ClassId == id && x.IsActive);
return result;
}
通过简单地返回.Any()结果,这些基本上可以是一行程序。我倾向于首先将结果选择到一个变量中,然后在单独的行中返回它,因为这样更容易断点和检查
如果需要返回“Ok”与“Error”的字符串,则:
方法应该努力做到一件事,并且把它做好。易于理解并在需要时排除故障。在方法中添加参数和条件代码只会使代码更加易变,并留下漏洞。最后,当初始方法可以简化时,它并没有使代码变得更短。我只是使用泛型repo找到了答案
public T GetEntity<T>(int Id)
where T : class
{
using (MyEntities rpContext = new MyEntities())
{
return rpContext.Set<T>().Find(e => e.Id == Id);
}
}
public T GetEntity(int-Id)
T:在哪里上课
{
使用(MyEntities rpContext=new MyEntities())
{
返回rpContext.Set().Find(e=>e.Id==Id);
}
}
打完电话
var entityStudent = GetEntity<Student>(1);
var entityTeacher = GetEntity<Teacher>(1);
var entityClasses = GetEntity<Classes>(1);
var entityStudent=GetEntity(1);
var entityTeacher=GetEntity(1);
var entityclass=GetEntity(1);
这不起作用,因为至少在创建数据库命令时,您必须区分要从中获取数据的各种表。您可以编写一个方法,在其中传递一个类型并在其中放入一个switch
语句,但这样做不会赢得太多,我认为这对我来说很有意义。吻普林西比在这里受到尊敬。所以我删除了我的答案。
var entityStudent = GetEntity<Student>(1);
var entityTeacher = GetEntity<Teacher>(1);
var entityClasses = GetEntity<Classes>(1);