2010-08-18 21 views
5

Imagine dos tablas: turnos, RANK_S_DAY. Turnos contiene una columna ShiftDate que es DateTime y RANK_S_DAY tiene una columna DayOfWeek. Necesito unirme a (int) ShiftDate.DayOfWeek igual a DayOfWeek. Entiendo por qué no funcionará, pero no estoy muy seguro de cómo puedo cambiarlo. La excepción es:LINQ a las entidades Únete en DateTime.DayOfWeek

El miembro de tipo especificado 'DayOfWeek' no es compatible con LINQ to Entities. Solo se admiten inicializadores, miembros de entidades y propiedades de navegación de entidades.

Según tengo entendido, LINQ no puede traducir (int) ShiftDate.DayOfWeek a algo que SQL entienda, ¿Alguna idea?

Aquí está el código:

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; 

Respuesta

1

Parece que no hay nada que pueda hacer a este nivel. Entonces, lo que hice fue crear un proceso almacenado que une las dos tablas y lo importé en la Entidad, creé una función de importación que devolvió una entidad de Turnos. No estoy seguro de si ese es el mejor enfoque, pero funciona y está limpio.

+0

Marque la respuesta real como "respuesta". – Monsignor

15

LINQ a SQL

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

LINQ a Entidades

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

Fuente:

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

+0

impresionante, eso es lo que estaba buscando! – Jacob

+0

@Jacob acaba de actualizar la respuesta para incluir el código correspondiente ... :) –

0

Curiosamente, esto funciona bien en 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 

esa consulta no tiene sentido - Es sólo un poco al azar se une con los tipos de datos adecuados. (Estaba usando 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