2010-04-19 31 views
5

dòng IQueryable của tôi là:LINQ lọc đối tượng IQueryable <T> (System.Data.Linq.DataQuery) bằng đối tượng Danh sách <T> (System.Collection.Generic.List)?

// find all timesheets for this period - from db so System.Data.Linq.DataQuery 
var timesheets = _timesheetRepository.FindByPeriod(dte1, dte2); 

Danh sách dòng của tôi là:

// get my team from AD - from active directory so System.Collection.Generic.List 
var adUsers = _adUserRepository.GetMyTeam(User.Identity.Name); 

Tôi muốn chỉ hiển thị bảng chấm công cho những người dùng trong bộ sưu tập timesheet có mặt trong bộ sưu tập người dùng.

Nếu tôi sử dụng một C# biểu hiện tiêu chuẩn như:

var teamsheets = from t in timesheets 
        join user in adUsers on t.User1.username equals user.fullname 
        select t; 

tôi nhận được lỗi "Một IQueryable trả về một biểu thức hằng số tự tham khảo không được hỗ trợ"

Bất kỳ đề xuất?

+0

Các đội lớn đến mức nào? – SteadyEddi

+0

Không quá 20 người dùng cho mỗi nhóm nếu điều đó - như vậy .contains nên giữ ra – Klaptrap

Trả lời

3

Cấu trúc kết nối sẽ không hoạt động nhưng bạn có thể sử dụng phương pháp Contains. Đoạn mã tiếp theo này có thể thực hiện thủ thuật.

string[] usernames = adUsers.Select(u => u.fullname).ToArray(); 

var teamsheets = 
    from t in timesheets 
    where usernames.Contains(t.User1.username) 
    select t; 
+0

Nứt nó - cảm ơn – Klaptrap

4

LINQ to SQL sẽ cố gắng tạo truy vấn sql để thể hiện toàn bộ biểu thức. Điều này có nghĩa là nó sẽ cố gắng chuyển vào bộ sưu tập của người dùng quảng cáo dưới dạng tham số cho truy vấn sql. Nếu có quá nhiều người dùng, truy vấn sẽ đạt đến giới hạn tham số (2100) và không thể thực hiện được. Nếu không có nhiều người dùng trong một nhóm, thì bạn có thể sử dụng biểu thức chứa sẽ được chuyển thành biểu thức "IN" trong sql.

Đây là những gì Steven đã gợi ý:

string[] usernames = adUsers.Select(u => u.fullname).ToArray(); 

var teamsheets = 
from t in timesheets 
where usernames.Contains(t.User1.username) 
select t; 

Cách duy nhất để sử dụng một tham gia theo cách mà bạn đã cố sẽ được lấy tất cả các bảng chấm công từ cơ sở dữ liệu vào bộ nhớ (sử dụng ToList trên timesheets var), và sau đó tham gia sẽ xảy ra trong bộ nhớ. Nếu điều này hoạt động tốt hơn việc sử dụng Chứa hoặc bạn không thể sử dụng Chứa vì kích thước nhóm, điều này có thể đáng xem xét.

+0

Cảm ơn lời giải thích bổ sung - tất cả đều có ý nghĩa trong một ánh sáng khác. – Klaptrap

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