首页 > 解决方案 > 如何在实体框架中编写通用查询?

问题描述

我有 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 方法。认为是参数具有不同ID的地方..谢谢。

标签: entity-frameworklinqdbcontextgeneric-programming

解决方案


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

例如,给出您的示例并假设“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";

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


推荐阅读