C# 生成要在Linq函数中调用的函数

C# 生成要在Linq函数中调用的函数,c#,.net,linq,entity-framework,C#,.net,Linq,Entity Framework,我可以使用EF在Linq函数中调用一个函数吗 比如说 int GetEmployeeStatus(string empID) { using (DB = new db()) { var status = db.EmployeeStatus .Where(e => e.EmpID == empID && e.StatusEndDate == null)

我可以使用EF在Linq函数中调用一个函数吗

比如说

int GetEmployeeStatus(string empID)
{
     using (DB = new db())
     {
           var status = db.EmployeeStatus
                        .Where(e => e.EmpID == empID && e.StatusEndDate == null)
                        .Select(e => e.Status)
                        .SingleOrDefault();
           return status;
     }
}
现在有没有一种方法可以在我的应用程序中的任何地方以如下方式使用上述函数:

    ....
    var empList = db.Employees
                  .Where(e => e.CostCenterID == 123 
                         && GetEmployeeStatus(e.EmpID) == 1);
    ....
我不想写一遍又一遍地寻找员工身份的信条,有没有办法做到这一点或类似的概念


还有一件事,我知道我编写函数的方式会导致每一行的数据库跳闸,我希望有办法避免这种情况,只需将查询嵌入Linq中,这样它就会被调用一次。

您可以使用扩展函数:

public static class DbContextExtensions 
{
    public static IQueryable<Employee> WhereX(this IQueryable<Employee> queryable, int id)
    {
        return queryable.Where(e => e.CostCenterID == 123);
    }
}
公共静态类DbContextensions
{
公共静态IQueryable,其中x(此IQueryable可查询,int-id)
{
返回queryable.Where(e=>e.CostCenterID==123);
}
}

+1,根据他的要求,我想您可能希望返回bool或int。很好,这个函数中生成的SQL会嵌入到调用linq表达式生成的SQL中吗?换言之,是一次数据库之旅吗?@HaLaBi我强烈建议您检查数据上下文的日志,亲自查看。如果你做得好,是的,这将是一次往返,但如果你做得不好,则不是。在开发新查询时(特别是在第一次使用新的查询提供程序时),始终要养成检查日志文件的习惯因为它可以帮助您了解如何编写有效的查询。无论您是使用扩展函数还是直接在db上下文中使用where子句,这都无关紧要。您甚至可以组合几个扩展函数。但是,正如@Servy所说的,如果您的查询被正确地发送到数据库(使用扩展方法或不使用扩展方法),您建议查看
DataContext.Log
?大多数优秀的开发人员都无法判断什么是好的SQL,什么是不好的SQL。希望这个链接能帮助你。一定要让我知道。