2012-09-13 32 views
12

Sau đây là các phương pháp nêu trên:hiển thị nó vào "Table1" bảng

public IList<tst> testUsers() 
{ 
    IList<tst> testUsers = _test.GetAll().ToList(); 
    return test(test); 
} 
+4

và bạn thậm chí còn có rất nhiều upvotes - đoán bạn phải cảm ơn Jon Skeet vì điều này! – Carsten

+1

@ John không phải là khó chịu nhưng nếu bạn đang sử dụng một công cụ cụ thể (Telerik trong trường hợp này), bạn có thể muốn đề cập đến rằng trong cơ thể của câu hỏi của bạn. Nó sẽ tác động đến câu trả lời của mọi người đối với bạn. –

Trả lời

2

Cách đơn giản nhất để nối hai IEnumerables trong LINQ là với gia():

var joined = from u in GetActiveUsers() 
       join ad in _adSnapshotRepository.GetAll() 
        on u.UserLogonName equals ad.UserLogonName 
       select new { User = u, Location = ad.Location } 

Tất nhiên, tham gia bây giờ là một IEnumerable của một loại vô danh. Nếu bạn đang hiển thị thông tin này trong chế độ xem lưới hoặc thứ gì đó yêu cầu đối tượng bằng phẳng, bạn có thể muốn tạo lớp của riêng mình với các thuộc tính bạn muốn từ mỗi bảng và chọn thay thế đó.

Hai điều khác cần lưu ý:

(1), bạn dường như luôn gọi ToList() sớm để chuyển đổi từ IQueryable để IEnumerable. Bằng cách đặt ToList() cho đến khi bạn đã thực hiện tất cả các phép nối và lọc của mình, bạn có thể nhận được hầu hết các truy vấn của mình xảy ra trong SQL (thay vì trong bộ nhớ).

(2) chứ không phải tham gia, nó thường thích hợp hơn để thiết lập các thuộc tính associtation về tổ chức của bạn và sử dụng những:

IQueryable<User> users = ... 
var combinedInfo = users.Select(u => new { User = u, Location = u.ADSnapshot.Location }) 
    .ToList(); 
+0

Tôi đang hiển thị trong một Lưới Telrik. Những gì tôi phải làm cho điều đó. –

+0

Đối với lưới Telerik, hãy tạo một lớp với các thuộc tính của các cột của bạn và chọn một cá thể mới của lớp đó (thay vì loại ẩn danh). Sau đó, chuyển IQueryable thành Telerik. Nếu bạn giữ mọi thứ như IQueryable, thì Telerik sẽ làm tất cả việc sắp xếp, lọc và phân trang trong SQL thay vì trong bộ nhớ trên máy chủ – ChaseMedallion

5

Để hiển thị Người sử dụng với Location tôi nghĩ rằng bạn cần một lớp được gọi là AdsnapshotUsers

public class AdsnapshotUsers 
{ 
// three fields UserId, UserLogonName, Location 

} 

Bây giờ tạo ra một phương pháp mà trở IList<AdsnapshotUsers>

public IList<AdsnapshotUsers> GetAdsnapshotUsers() 
{ 
List<User> Users = GetAcitveUsers().ToList(); 
List<ADSnapshot> adSnapshotUsers = _adSnapshotRepository.GetAll().ToList(); 

    return (from u in Users 
     join ad in adSnapshotUsers on u.UserLogonName equals ad.UserLogonName 
     select new AdsnapshotUsers { 
      UserId= u.UserId, UserLogonName = u.UserLogonName, Location = ad.Location 
     } 
    ).ToList<AdsnapshotUsers>(); 
} 

Left Outer Join để hiển thị tất cả các giá trị từ bảng người sử dụng dù cho nếu một userlogonname là không có mặt trong bảng adsnapshot (giá trị vị trí trống)

(from u in Users 
    join ad in adSnapshotUsers on u.UserLogonName equals ad.UserLogonName into aduserselect 
    from ad1 in aduserselect.DefaultIfEmpty() 
    select new AdsnapshotUsers { 
     UserId= u.UserId, UserLogonName = u.UserLogonName, Location = ad1.Location 
    } 
).ToList<AdsnapshotUsers>(); 

Ở đây tất cả các bản ghi từ bảng người dùng sẽ được lựa chọn và cho vị trí nếu userlogonname tồn tại sau đó giá trị tên vị trí được đặt bằng giá trị bảng ADSnapshot nếu không không tồn tại thì đặt giá trị rỗng mặc định.

+0

Thay vì trả về kiểu ẩn danh, tôi nghĩ tốt hơn là tạo lớp tùy chỉnh và trả về nó. –

+0

Tôi không thể thực thi sau khi thêm các dòng mã trên. Tôi đặt điểm ngắt. Nó gọi một lần nữa và một lần nữa GetAdsnapshotUsers() phương pháp như trong vòng lặp liên tục. –

+0

Thông báo lỗi được ném thành "Ngoại lệ không được loại trừ của loại 'System.StackOverflowException' xảy ra" sau khi loại bỏ điểm ngắt và thực hiện. –

0

Nếu bạn có mối quan hệ (1: 1) giữa hai bảng này thì bạn có thể nhận bản ghi rất dễ dàng chỉ bằng một truy vấn. và các bản ghi chẵn không có mặt trong bảng thứ hai.

Tôi đang sử dụng định nghĩa lớp được xác định ở trên để lưu trữ dữ liệu.

_userRepository.GetAll().Select(u=>new AdsnapshotUsers { 
     UserId= u.UserId, 
     UserLogonName = u.UserLogonName, 
     Location = u.ADSnapshot.Location 
}).ToList(); 
Các vấn đề liên quan