2012-04-10 52 views
6

Tôi có một truy vấn LINQ trả về cho một loại var myQryngày So sánh trong truy vấn sử dụng LINQ

var myQry = from ..... 

Đây là một LINQ lớn trả về tất cả các hồ sơ mà tôi cần để lọc thêm. Trong một trong những điều kiện nếu tôi có bộ lọc chạy như thế này để kiểm tra ngày tháng. Tôi cần kiểm tra xem tên có chứa tên đã nhập và khớp chính xác với ngày sinh không.

Tôi cố gắng này mà biên dịch và chạy, nhưng đã không làm việc một cách chính xác

myQry.Where(x => x.FirstName.Contains(strName) && DateTime.Compare(x.BirthDt, searchDt)>=0).ToList() 

Sau đó, tôi đã cố gắng này đã mang đến cho ném một ngoại lệ "lập luận DbArithmeticExpression phải có một loại phổ biến số"

myQry.Where(x => x.FirstName.Contains(strName) && (x.BirthDt- searchDt).Days == 0).ToList(); 

Đối với loại tình huống như vậy khi tôi sử dụng mệnh đề where trên truy vấn của tôi, cách tốt nhất để so sánh ngày là gì? Loại hoạt động nào không được phép trong mệnh đề where của truy vấn LINQ?

Cảm ơn thời gian của bạn ...

+0

Loại 'x.BirthDt' là gì? Loại 'searchDt' là gì? Rõ ràng chúng không phải là cả hai 'DateTime'. – Servy

+0

Và bạn có trong linq2sql hoặc linq2entities không? –

+1

Cả hai đều là datetime. Tôi đang ở linq2sql – user20358

Trả lời

3

Trong trường hợp này, bạn có thể muốn sử dụng các hàm cụ thể của SQL Server bằng các phương thức từ lớp SqlMethods.

truy vấn thứ hai của bạn có thể được viết lại như

myQry.Where(x => x.FirstName.Contains(strName) && 
    SqlMethods.DateDiffDay(x.BirthDt, searchDt) == 0).ToList() 

đó sẽ được dịch sang một cái gì đó giống như

SELECT ... FROM Table WHERE FirstName 
    LIKE '@p0' AND DATEDIFF(Day, BirthDt, @p1) = @p2 

nơi p0, p1 và p2 là các thông số.

3

Hãy thử điều này:

myQry.Where(x => x.FirstName.Contains(strName) && 
x.BirthDt.Date == searchDt.Date).ToList() 

Lưu ý rằng cho ở trên để làm việc, cả hai BirthDtsearchDt phải giá trị DateTime hợp lệ. Bây giờ bạn chỉ so sánh phần Date của các giá trị DateTime loại bỏ phần Thời gian.

1

Các hoạt động nào được hỗ trợ phụ thuộc vào khung ORM, (Nhibernate, EF, v.v.), nhưng về cơ bản bạn có thể xem xét rằng nếu phương pháp bạn đang sử dụng không có bản dịch nghĩa đen cho SQL, rất có khả năng nó sẽ không được hỗ trợ.

Đó là lý do tại sao toán tử == được hỗ trợ nhưng không hỗ trợ phương thức DateTime.Compare hoặc nhà điều hành - trong DateTime không được hỗ trợ vì nó không có bản dịch rõ ràng.

Luôn cố gắng gắn bó với toán tử đơn giản nhất và tránh các phương pháp, nếu vẫn không thành công, bạn sẽ phải sử dụng Google nếu phương pháp cụ thể đó được hỗ trợ bởi ORM của bạn.

1

Tôi đồng ý với Leniel Macaferi về việc cập nhật mệnh đề Where và so sánh ngày thay vì datetimes. Đối với một ngày sinh, thường là thời điểm sinh không liên quan. Để trả lời câu hỏi thứ hai của bạn

Loại thao tác nào không được phép trong mệnh đề where của truy vấn LINQ ?

Where() là phương pháp tiện ích hoạt động trên IEnumerable<T> hoặc IQueryable<T>. Chúng ta có thể thấy điều này bằng cách nhấn F12 trên Where để xem mã nguồn:

public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate); 

Các hoạt động được hỗ trợ được gọi là vị từ. Một biến vị ngữ là một đại biểu lấy một đối số kiểu TSource và trả về một bool cho chúng ta biết liệu điều kiện đó có phù hợp hay không. Điều này có thể được nhìn thấy trong mã ở trên trong tham số thứ hai: Func<TSource, bool> predicate

Bạn có thể xác định vị từ là bất kỳ điều gì bạn muốn.Miễn là nó trả về một bool và chấp nhận 1 tham số kiểu TSource.

Điều này thường đạt được bằng cách xác định biểu thức lambda, đó là những gì Leniel Macaferi đã làm cho bạn.

Các vấn đề liên quan