У меня есть эта хранимая процедура, которую я хотел бы преобразовать в 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
};
Спасибо заранее.
Это (бесплатно только для пробной версии) может быть полезно: http://www.sqltolinq.com/
И совершенно бесплатный инструмент:
Я знаю, что этот вопрос старый, но я думаю, что ему нужен правильный ответ, я получаю к этому поиску поиск эквивалента 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