2010-08-18 38 views
5

Hãy tưởng tượng hai bảng: Thay đổi, RANK_S_DAY. Ca làm việc có chứa cột ShiftDate là DateTime và RANK_S_DAY có cột DayOfWeek. Tôi cần tham gia (int) ShiftDate.DayOfWeek bằng DayOfWeek. Tôi hiểu tại sao nó sẽ không hoạt động, nhưng tôi không hoàn toàn chắc chắn làm thế nào tôi có thể thay đổi nó. Ngoại lệ là:LINQ to Entities Tham gia vào DateTime.DayOfWeek

Thành viên loại được chỉ định 'DayOfWeek' không được hỗ trợ trong LINQ to Entities. Chỉ các trình khởi tạo, thành viên thực thể và thuộc tính điều hướng thực thể mới được hỗ trợ.

Như tôi đã hiểu, LINQ không thể dịch (int) ShiftDate.DayOfWeek thành điều gì đó mà SQL hiểu được, Bất kỳ ý tưởng nào?

Đây là mã:

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; 

Trả lời

1

Nó xuất hiện không có bất cứ điều gì tôi có thể làm ở cấp độ này. Vì vậy, những gì tôi đã làm được tạo ra một proc được lưu trữ tham gia hai bảng và nhập nó vào thực thể, tạo ra một chức năng nhập khẩu trả về một thực thể thay đổi. Không chắc chắn nếu đó là cách tiếp cận tốt nhất, nhưng nó hoạt động và sạch sẽ.

+0

Vui lòng đánh dấu câu trả lời thực là "câu trả lời". – Monsignor

15

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); 

Nguồn:

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

+0

tuyệt vời, đó là những gì tôi đang tìm kiếm! – Jacob

+0

@Jacob vừa cập nhật câu trả lời để bao gồm mã có liên quan ... :) –

0

Điều thú vị là, này hoạt động tốt trong 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 

truy vấn đó là vô nghĩa - Đó chỉ là một số ngẫu nhiên tham gia với các kiểu dữ liệu thích hợp. (Tôi đã sử dụng 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 
Các vấn đề liên quan