LINQ to Entities加入DateTime.DayOfWeek

时间:2010-08-18 23:21:08

标签: sql linq join entities dayofweek

想象一下两个表:Shifts,RANK_S_DAY。移位包含ShiftDate列,DateTime,RANK_S_DAY列为DayOfWeek。我需要加入(int)ShiftDate.DayOfWeek equals DayOfWeek。我理解为什么它不起作用,但我不确定如何改变它。例外是:

  

LINQ to Entities不支持指定的类型成员'DayOfWeek'。仅支持初始化程序,实体成员和实体导航属性。

据我所知,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 个答案:

答案 0 :(得分:16)

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 :(得分:1)

看来在这个级别上我无能为力。所以我所做的是创建一个存储过程,它连接两个表并将其导入实体,创建一个返回Shifts实体的函数导入。不确定这是否是最好的方法,但它的工作原理是干净的。

答案 2 :(得分: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

答案 3 :(得分:0)

有趣的是,这在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)