2010-08-18 15 views
5

Wyobraź sobie dwie tabele: Shifts, RANK_S_DAY. Przesunięcia zawierają kolumnę ShiftDate, która jest DateTime, a RANK_S_DAY ma kolumnę DayOfWeek. Muszę dołączyć (int) ShiftDate.DayOfWeek jest równy DayOfWeek. Rozumiem, dlaczego to nie zadziała, ale nie jestem do końca pewien, jak mogę to zmienić. Wyjątek:LINQ do encji Dołącz do DateTime.DayOfWeek

Określony element typu "DayOfWeek" nie jest obsługiwany w LINQ do jednostek. Obsługiwane są tylko inicjatory, elementy encji i właściwości nawigacji jednostki.

Jak rozumiem, LINQ nie może przetłumaczyć (int) ShiftDate.DayOfWeek na coś, co SQL rozumie, Jakieś pomysły?

Oto kod:

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; 

Odpowiedz

1

Wydaje się, że nie jest coś, co mogę zrobić na tym poziomie. Zrobiłem więc zapisany proces, który łączy dwie tabele i zaimportował je do encji, utworzył import funkcji, który zwrócił encję przesunięć. Nie jestem pewien, czy to najlepsze podejście, ale działa i jest czyste.

+0

Proszę oznaczyć prawdziwą odpowiedź jako "odpowiedź". – Monsignor

15

LINQ to SQL

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

LINQ podmiotom

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

Źródło:

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

+0

niesamowite, tego właśnie szukałem! – Jacob

+0

@Jacob właśnie zaktualizował odpowiedź, aby dołączyć odpowiedni kod ... :) –

0

Co ciekawe, to działa dobrze w LINQ-SQL:

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

To zapytanie jest bez znaczenia - to tylko niektóre losowe łączy się z odpowiednich typów danych. (Używałem Northwind)

1
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 
Powiązane problemy