Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何在实体框架中编写通用查询?_Entity Framework_Linq_Dbcontext_Generic Programming - Fatal编程技术网

Entity framework 如何在实体框架中编写通用查询?

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

我有3个方法这些方法都是相同的,只有一些参数会改变我想写一个方法我怎么写

        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);