2010-06-22 40 views
11

Tôi muốn tạo một truy vấn với một dấu chéo áp dụng vào hàm giá trị bảng do người dùng định nghĩa trong LINQ. SQL sẽ thực sự chứ không phải đơn giản như sau:Áp dụng LINQ to SQL chéo

SELECT * 
FROM MyTable mt 
CROSS APPLY MyTVF(mt.id) 

This bài đưa ra một ví dụ về một truy vấn LINQ có kết quả trong sql tạo ra có chứa cả một cây thánh giá áp dụng và một bên ngoài áp dụng nhưng chỉ cho một truy vấn phụ không cho một tvf. This bài viết xác nhận rằng LINQ to SQL sẽ tạo ra áp dụng chéo và áp dụng toán tử bên ngoài cho "điều hướng mối quan hệ" nhưng tôi không chắc điều đó có nghĩa là gì trong ngữ cảnh này. This bài mô tả khá nhiều những gì tôi muốn làm và câu trả lời cho biết cách duy nhất để làm điều này là để bọc các truy vấn SQL trong một thủ tục được lưu trữ và sau đó gọi sp thông qua LINQ. Tôi hy vọng rằng điều này là không đúng bởi vì tôi thực sự cần một tvf có thể được sử dụng theo cách này trong suốt một ứng dụng trong nhiều truy vấn LINQ vì vậy "bọc nó trong một sp" sẽ không làm việc cho tôi. Có ai biết một cách để có được một cái gì đó giống như câu lệnh SQL đơn giản trên thông qua LINQ?

+0

giữ trong tâm trí, mối quan hệ giữa LINQ và SQL không phải là tính từ, vì vậy không phải mọi câu lệnh SQL đều có thể được hiểu thông qua LINQ. – nothrow

Trả lời

15

Làm thế nào về điều này:

from mt in db.MyTable 
from mf in db.MyTVF (mt.id) 
select new { mt.Blah, mf.Blah } 
+0

Vâng, điều đó hoàn toàn có tác dụng, tôi không thể tin rằng tôi thậm chí không thử điều đó. Một lời cảm ơn tốt đẹp. –

0
var query = ActivityRepository.Where(p => p.iAction > -1 && userIds.Contains(p.iSellerId)).GroupBy(c => c.iSellerId).Select(c => c.OrderByDescending(cc => cc.dBeginTime).First()).Select(a => new ActivityInfo 
     { 
      ActivityId = a.iActivityId, 
      StartTime = a.dBeginTime, 
      SellerId = a.iSellerId, 
      EndTime = a.dEndTime, 
      ActivityName = a.sName, 
     }); 

các keypoint là: .Chọn (c => c.OrderByDescending (cc => cc.dBeginTime) .First())

+1

mã này có thể tạo cú pháp OUTER APPLY – adu

+0

Thú vị khi biết. Tôi đã chuyển sang EF nhiều ngày nay, chưa sử dụng LinqToSQL trong một vài năm. –