2016-02-10 13 views
6

Tôi đang sử dụng LINQ với khung Entity để tham gia ba bảng và tôi đang trả về giao diện IList.foreach trên IEnumerable hoặc IList

Tôi muốn áp dụng vòng lặp foreach trên giá trị trả về này để tôi có thể điền giá trị vào mô hình của mình.

Đây là cách tôi đang tham gia:

public IList GetData(long Id) 
{ 
    //var q = dataContext.tblUsers.AsEnumerable().Join(dataContext.tblUsersProfiles.AsEnumerable(),) 
    var query = from u in dataContext.tblUsers 
    join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
    join c in dataContext.tblComments on u.Id equals c.Commentedby 

    where c.Id == Id 
    select new { u.Firstname, u.Lastname, p.ProfilePicPath, c.Comment, c.CommentDate }; 

    return query.ToList(); 
} 

Tôi muốn để cư các giá trị trong Danh sách của tôi về Mẫu. Tôi đã cố gắng này:

var lst = repository.GetDate(Id); 
foreach (var item in lst) 
{ 

} 

Nhưng tôi không thể truy cập vào mục Firstname/Lastname, vv

Tôi cũng đã cố gắng sử dụng đối tượng itemobject[] item nhưng cả hai đều không được làm việc quá.

Làm cách nào để áp dụng for mỗi on IList`?

Nó sẽ hoạt động tốt Nếu tôi có thể trả lại DataTable thay vì IList trong trường hợp này.

Trả lời

7

bạn đang tạo ra một loại vô danh. Chỉ cần xác định một lớp học cho kết quả của truy vấn của bạn, sau đó các kiểu trả về của hàm của bạn nên là như thế này:

public IList<YourClassName> GetData(long Id) 
{ 

} 

giá trị Set lớp như thế này:

select new YourClassName 
{ 
    Firstname = u.Firstname, 
    Lastname = u.Lastname, 
    ProfilePicPath = p.ProfilePicPath, 
    Comment = c.Comment, 
    CommentDate = c.CommentDate 
}; 
1

Bạn đang tạo một loại vô danh:

select new { u.Firstname, u.Lastname, p.ProfilePicPath, c.Comment, c.CommentDate }; 

Nếu bạn muốn chuyển dữ liệu này với các phương pháp khác vv bạn cần phải tạo ra một lớp thực.

public class DataClass 
{ 
    public string Firstname { get; set; } 
    public string LastName{ get; set; } 
    public string ProfilePicPath { get; set; } 
    public string Comment { get; set; } 
    public DateTime CommentDate { get; set; } 
} 

và sử dụng nó:

public IList<DataClass> GetData(long Id) 
{ 
    var query = from u in dataContext.tblUsers 
       join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
       join c in dataContext.tblComments on u.Id equals c.Commentedby 
       where c.Id == Id 
    select new DataClass 
    { 
     Firstname = u.Firstname, 
     Lastname = u.Lastname, 
     ProfilePicPath = p.ProfilePicPath, 
     Comment = c.Comment, 
     CommentDate = c.CommentDate 
    }; 

    return query.ToList(); 
} 
0

Bạn đang sử dụng một loại vô danh do đó bạn không thể truyền bất kỳ thứ gì khi lặp qua danh sách của bạn. Bạn có thể thử sử dụng dynamic thay vì var có nghĩa là bạn có thể gọi bất cứ tài sản trên đó miễn là nó tồn tại trong thời gian chạy:

foreach (dynamic item in lst) 
{ 
    string firstName = item.FirstName; 
} 

hoặc rõ ràng xác định một lớp học cho các mục kết quả như những câu trả lời khác đang đề xuất.

0

Bạn phải thay đổi GetData loại trả về. Vui lòng thử điều này:

public List<tblUsers> GetData(long Id) 
     { 
      //var q = dataContext.tblUsers.AsEnumerable().Join(dataContext.tblUsersProfiles.AsEnumerable(),) 
      var query = from u in dataContext.tblUsers 
         join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
         join c in dataContext.tblComments on u.Id equals c.Commentedby 
         where c.Id == Id 
         select new tblUsers { u.Firstname, u.Lastname, p.ProfilePicPath, c.Comment, c.CommentDate }; 
      return query.ToList(); 
     } 
1

Bạn không chỉ trả lại giao diện IList mà còn giao diện thông minh với loại của bạn. Bây giờ bạn returtint đối tượng anounymouse.

Vì vậy, những gì tôi muốn đề xuất.Tạo lớp này:

public class MyCustomContainer 
{ 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    public string ProfilePicPath { get; set; } 
    public string Comment { get; set; } 
    public string CommentDate { get; set; } 
} 

Và sự thay đổi phương pháp của bạn như thế này:

public IList<MyCustomContainer> GetData(long Id) 
     { 
      //var q = dataContext.tblUsers.AsEnumerable().Join(dataContext.tblUsersProfiles.AsEnumerable(),) 
      var query = from u in dataContext.tblUsers 
         join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
         join c in dataContext.tblComments on u.Id equals c.Commentedby 
         where c.Id == Id 
         select new MyCustomContainer 
         { 
          Firstname = u.Firstname, 
          Lastname = u.Lastname, 
          ProfilePicPath = p.ProfilePicPath, 
          Comment = c.Comment, 
          CommentDate = c.CommentDate 
          }; 
      return query.ToList(); 
     } 

Bây giờ bạn trở về không anonymouse đối tượng trong Danh sách, do đó bạn có thể nhận được tất cả các thuộc tính bạn cần

4

Bạn đang trở về một danh sách anonymous của objects trong phương pháp. Bạn có thể truy cập các thuộc tính bằng cách sử dụng sự phản chiếu nhưng điều này là chậm trong thời gian chạy. Dễ nhất để lấy thông tin kiểu là xác định một lớp và sử dụng nó trong câu lệnh select.

public class Person 
{ 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    /* ... */ 
} 

public IList<Person> GetData(long Id) 
{ 
    var query = from u in dataContext.tblUsers 
       join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
       join c in dataContext.tblComments on u.Id equals c.Commentedby 
       where c.Id == Id 
       select new Person { u.Firstname, u.Lastname /* ... */ }; 
     return query.ToList(); 
} 
Các vấn đề liên quan