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

时间:2018-05-15 07:13:54

标签: entity-framework linq dbcontext generic-programming

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

catch :from_inner do
  if condition A
    if condition A.1
      # ...
    elsif condition A.2
      # ...
    else 
      throw :from_inner
    end 
    # ...
  end
end

我认为编写1方法非常简单。思考是参数有不同的id .. 感谢。

4 个答案:

答案 0 :(得分:1)

避免基于参数的条件逻辑。这导致脆弱的代码,因为必须测试每个参数组合以被认为是可靠的。这导致复杂的代码很容易出错。使用更简单的单一用途方法通常更可靠,更易于理解和维护。

例如,给出您的示例并假设“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”的字符串,则:

return result ? "OK" : "Error";

方法应该努力做一件事,做得好。如果需要,易于理解和故障排除。在方法中添加参数和条件代码只会使代码更加不稳定,并为bug留下空白。最后,当初始方法可以简化时,它不会使代码更短。

答案 1 :(得分:0)

如果签名相同,则不能重载方法。

您有两种方法具有相同的签名:

public string checkexist(int id)

您可以做的是重命名您的方法,如下所示:

public interface WriteSomethingHere { 

   public boolean isStudentExist(int id);
   public boolean isTeacherExist(int id);
   public boolean isClassExist(int id);
}

答案 2 :(得分:0)

我刚刚使用通用仓库找到答案

public T GetEntity<T>(int Id)
where T : class
    {
        using (MyEntities rpContext = new MyEntities())
        {
            return rpContext.Set<T>().Find(e => e.Id == Id);
        }
    }

之后

var entityStudent = GetEntity<Student>(1);
var entityTeacher = GetEntity<Teacher>(1);
var entityClasses = GetEntity<Classes>(1);

答案 3 :(得分:-1)

您有创建枚举

  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";
  }
}