2010-08-18 138 views
5

想象一下兩個表格:Shifts,RANK_S_DAY。 Shifts包含一個ShiftDate列,它是DateTime,RANK_S_DAY有一個DayOfWeek列。我需要加入(int)ShiftDate.DayOfWeek等於DayOfWeek。我明白爲什麼它不起作用,但我不太清楚如何改變它。例外是:LINQ to Entities加入DateTime.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; 

回答

1

看來沒有什麼我可以在這個層面做。因此,我所做的是創建一個存儲過程,將兩個表連接起來並將其導入實體,創建一個返回Shifts實體的函數導入。不知道這是否是最好的方法,但它的工作原理和清潔。

+0

請將真實答案標記爲「答案」。 – Monsignor 2016-01-27 07:06:59

15

的LINQ to SQL

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

LINQ到實體

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/

+0

真棒,這就是我一直在尋找! – Jacob 2013-02-19 14:26:27

+0

@Jacob只是更新了包含相關代碼的答案...... :) – 2013-02-19 14:28:49

0

有趣的是,這個工作正常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 

查詢是沒有意義的 - 它只是用正確的數據類型的一些隨機連接。 (我正在使用羅斯文)

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