LINQ to Entities Присоединиться к DateTime.DayOfWeek - PullRequest
6 голосов
/ 19 августа 2010

Представьте себе две таблицы: Смены, RANK_S_DAY.Shifts содержит столбец ShiftDate со значением DateTime, а RANK_S_DAY со столбцом DayOfWeek.Мне нужно присоединиться (int)ShiftDate.DayOfWeek equals DayOfWeek.Я понимаю, почему это не сработает, но я не совсем уверен, как я могу это изменить.Исключением является:

Указанный элемент типа 'DayOfWeek' не поддерживается в LINQ to Entities.Поддерживаются только инициализаторы, элементы сущностей и свойства навигации сущностей.

Насколько я понимаю, LINQ не может перевести (int)ShiftDate.DayOfWeek в то, что понимает SQL, Есть идеи?

Здесьэто код:

Shifts = from s in en.Shifts
join j in en.RANK_S_JOB on s.kronos_JobPositions.JobID equals j.JOBNO
join d in en.RANK_S_DAY on (int)s.ShiftDate.DayOFWeek equals d.DAY_OF_WEEK
orderby
 d.RANK,
 j.RANK ascending
select s;

Ответы [ 4 ]

16 голосов
/ 19 августа 2010

LINQ to SQL

var dayOfWeekCondition = (dt => dt.DayOfWeek == dayOfWeek);

LINQ to Entities

int dow = (int)dayOfWeek + 1; // SQL Day of week
var dayOfWeekCondition = (dt => SqlFunctions.DatePart(“weekday”, dt) == dow);

Источник:

http://blog.abodit.com/2009/07/entity-framework-in-net-4-0/

1 голос
/ 13 сентября 2012
using System.Data.Objects.SqlClient; //Don't forget this!!

//You can access to SQL DatePart function using something like this:

YourTable.Select(t => new { DayOfWeek = SqlFunctions.DatePart("weekday", t.dateTimeField) - 1 }); //Zero based in SQL

//You can compare to SQL DatePart function using something like this:

DateTime dateToCompare = DateTime.Today;
YourTable.Where(t => SqlFunctions.DatePart("weekday", t.dateTimeField) - 1 == dateToCompare }); //Zero based in SQL
1 голос
/ 19 августа 2010

Похоже, я ничего не могу сделать на этом уровне. Итак, я создал хранимый процесс, который соединяет две таблицы и импортирует его в Entity, создает функцию импорта, которая возвращает сущность Shifts. Не уверен, что это лучший подход, но он работает и чисто.

0 голосов
/ 19 августа 2010

Интересно, это прекрасно работает в Linq-to-Sql:

from o in Orders
join c in Categories on (int) o.OrderDate.Value.DayOfWeek equals c.CategoryID
where o.OrderDate != null
select c

Этот запрос не имеет смысла - это просто случайные объединения с правильными типами данных. (Я использовал Northwind)

...