SQL в Linq эквивалент

2

У меня есть эта хранимая процедура, которую я хотел бы преобразовать в LINQ to SQL, но у меня проблемы, потому что я новичок в LINQ (и на самом деле я не являюсь SQL-гуру), и я я не получаю ожидаемых результатов. (Я попытался вызвать SPROC из LINQ to SQL, но когда я отправляю в период datetime как параметр в SPROC, я получаю некоторую ошибку на L2S о том, что параметр имеет значение NULL, но я отправил его также не-nullable, и я все равно получаю ту же ошибку. ) Ниже приведен 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 - это число, равное нулю: datetime:

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

Спасибо заранее.

Теги:
linq
stored-procedures

2 ответа

2

Это (бесплатно только для пробной версии) может быть полезно: http://www.sqltolinq.com/

  • Linqer - это инструмент преобразования SQL в LINQ.
  • Это поможет вам изучить LINQ и преобразовать существующие SQL-запросы.
  • Не каждый оператор SQL может быть преобразован в LINQ, но Linqer охватывает множество различных выражений SQL.
  • Linqer поддерживает как .NET-языки С#, так и Visual Basic.

И совершенно бесплатный инструмент:

http://www.linqpad.net/

  • LINQPad также отличный способ узнать LINQ: он поставляется с предустановленными 200 примерами из книги С# 3.0 в двух словах. Нет лучшего способа испытать прохладу LINQ и функционального программирования.
  • 0
    Спасибо за Ваш ответ. Я знал о LINQPad, но, думаю, попробую.
0

Я знаю, что этот вопрос старый, но я думаю, что ему нужен правильный ответ, я получаю к этому поиску поиск эквивалента LINQ ключевого слова IN SQL и вижу, что эквивалентный код LINQ для этого запроса не предоставляется, возможно, Оригинальный автор ответил на этот вопрос некоторое время назад, но я оставляю это для других людей, ищущих в Интернете:

Я получил ответы на один, если вы хотите, чтобы Left Outer Joins:

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

контекст переменной - это контекст Linq to SQL или Linq to Entity Context

Ещё вопросы

Сообщество Overcoder
Наверх
Меню