【问题标题】:SQL to Linq equivalentSQL 到 Linq 等效
【发布时间】:2011-01-08 12:26:36
【问题描述】:

我有这个存储过程,我想将其转换为 LINQ to SQL,但我遇到了一些麻烦,因为我是 LINQ 的新手(实际上,我不是 SQL 专家)而且我我没有得到预期的结果。 (我尝试从 LINQ 调用 SPROC 到 SQL,但是当我将 Period 日期时间作为 SPROC 上的参数发送时,我在 L2S 上收到一些关于该参数可以为空的错误,但我发送它也不可为空,我仍然得到相同的错误。 ) 下面是 SQL:

SELECT  Persons.IDPerson,Persons.Name,Persons.PaternalName,Departments.DepartmentName,Jobs.Title, Persons.HireDate, Terminations.TerminationDate, Terminations.HireDate
FROM Persons left outer join Terminations on Persons.IDPerson = Terminations.IDPerson
             left outer join Departments on Departments.idDepartment = Persons.IdDepartment
             left outer join Jobs on Jobs.IDJob = Persons.IDJob          
WHERE (Terminations.IDTermination is null OR    Terminations.TerminationDate >= @Period) 
       and Terminations.HireDate <= @Period OR Persons.HireDate <=@Period
ORDER BY Persons.HireDate, Terminations.HireDate asc

到目前为止,这是我的 LINQ 代码(它可以编译,但没有给我预期的记录) Criteria.Period 是一个可为空的日期时间:

 result = from emp in HRSystemDB.Persons.OfType<Employee>()
                     join term in HRSystemDB.Terminations on emp.IDPerson equals term.IDPerson into all
                     from aHire in all.Where(t => (t.IDTermination == null || t.TerminationDate.Date >= Criteria.Period.Value.Date)
                         && t.HireDate.Value.Date <= Criteria.Period.Value.Date
                         || emp.HireDate.Date <= Criteria.Period.Value.Date).DefaultIfEmpty()
                     select new DepartmentHeadCountQuery
                     {
                         FullName = emp.Name + " " + emp.PaternalName,
                         Department = emp.Department.DepartmentName,
                         JobTitle = emp.Job.Title,
                         TermDate = aHire.TerminationDate,
                         EHiredDate = emp.HireDate,
                         TermHireDate = aHire.TerminationDate
                     };

提前致谢。

【问题讨论】:

    标签: c# .net sql linq stored-procedures


    【解决方案1】:

    我知道这个问题很老了,但我认为它需要一个正确的答案,我开始搜索 IN SQL 关键字的 LINQ 等效项,发现没有提供此查询的等效 LINQ 代码,也许是原作者前段时间回答了这个问题,但我把这个留给在互联网上搜索的其他人:

    如果你喜欢左外连接,我必须回答一个:

    var query = from emp in context.Persons
                join ter in context.Terminations on emp.Id equals ter.IdPerson into terminations
                join dep in context.Departments on  emp.IdDeparment equals dep.IdDepartment into departments
                join job in context.Jobs on  emp.IdJob equals job.IdJob into jobs
                from ter in terminations.DefaultIfEmpty() //Does an Left Outer Join
                from dep in departments.DefaultIfEmpty()
                from job in jobs.DefaultIfEmpty()
                where (ter.IdTermination == null || ter.TerminationDate >= period)
                && (ter.HireDate <= period || emp.HireDate <=period)
                select new 
                { 
                    emp.Id, 
                    emp.Name,
                    emp.PaternalName,
                    dep.DepartmentName, 
                    job.Title,  
                    emp.HireDate,
                    ter.TerminationDate,
                    TerminationHireDate=ter.HireDate
                    };  
    

    使用内连接

        var query = from emp in context.Persons
                join ter in context.Terminations on emp.Id equals ter.IdPerson 
                join dep in context.Departments on  emp.IdDeparment equals dep.IdDepartment 
                join job in context.Jobs on  emp.IdJob equals job.IdJob 
                where (ter.IdTermination == null || ter.TerminationDate >= period)
                && (ter.HireDate <= period || emp.HireDate <=period)
                select new 
                { 
                    emp.Id, 
                    emp.Name,
                    emp.PaternalName,
                    dep.DepartmentName, 
                    job.Title,  
                    emp.HireDate,
                    ter.TerminationDate,
                    TerminationHireDate=ter.HireDate
                    };      
    

    变量 context 是 Linq to SQL 或 Linq to Entity Context

    【讨论】:

      【解决方案2】:

      这个(免费试用)很有用:http://www.sqltolinq.com/

      • Linqer 是一种 SQL 到 LINQ 的转换工具。
      • 它将帮助您学习 LINQ 并转换您现有的 SQL 语句。
      • 并非每个 SQL 语句都可以转换为 LINQ,但 Linqer 涵盖了许多不同类型的 SQL 表达式。
      • Linqer 支持 .NET 语言 C# 和 Visual Basic。

      还有一个完全免费的工具:

      http://www.linqpad.net/

      • LINQPad 也是学习 LINQ 的好方法:它预装了书中的 200 个示例,C# 3.0 in a Nutshell。没有比这更好的方式来体验 LINQ 和函数式编程的酷炫了。

      【讨论】:

      • 感谢您的回答。我知道 LINQPad,但我想我会试一试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 2021-09-17
      • 2017-09-24
      • 2015-10-24
      • 1970-01-01
      相关资源
      最近更新 更多