2013-03-13 29 views
6

Có một lớpđèo trong mệnh đề where của LINQ Query

Public class Student 
{ 
    int id; 
    int rollNum; 
    String Name; 
} 

một phương pháp

Public List<Student> GetAllStudents() 
{ 
    var studentList = GetMeAll(); // Simple select * query to get all students 
    //unfortunately i can't make changes in this method so have to write a linq query to  //filter data. 
    //getting int array ids correctly from some method 
    var filterList = FilterStudentsByID(ids,StudentList); 
} 

Tôi muốn viết một phương pháp mà phải mất một mảng int như là đầu vào và trả về một danh sách

Public List<Student> FilterStudentsByID(int[] ids,List<student> studentList) 
{ 
    //There should be a linq query , but I am new to linq so don't know how to write this. 
    Var list = from studentList in ..... don't know much; 
} 

Bất kỳ trợ giúp nào khi viết truy vấn. Cảm ơn tất cả các bạn cho câu trả lời, tôi cũng đang tìm kiếm để duy trì các buổi biểu diễn với danh sách lớn các hồ sơ? Nó sẽ là tuyệt vời nếu bạn có thể thêm tôi giải thích đơn giản của các truy vấn sẽ làm việc nội bộ ??

+0

Mỗi học sinh có một ID duy nhất không? –

+0

có chúng độc đáo – ankur

+0

Ngoài ra: Danh sách các id có dài không (nhiều hơn 5% kích thước của danh sách sinh viên)? Chỉ cần cố gắng tìm ra nếu nó đáng để tạo danh sách các sinh viên được sắp xếp theo ID trước khi thực hiện tìm kiếm. –

Trả lời

10

Nếu bạn đang tìm kiếm để tìm những sinh viên đến từ danh sách có id có mặt trong ids mảng sau đó:

var list = from s in stundentList 
      where ids.Contains(s.ID) 
      select s; 
+0

Bạn có thể giải thích cho tôi cách thức này sẽ làm việc nội bộ, như nó sẽ cản trở hiệu suất trong trường hợp danh sách lớn ?? – ankur

+0

Có vẻ như nó sẽ là O (N * M) trong đó N = số học sinh, M = Số lượng ID. Nhưng bạn không thể làm tốt hơn nhiều, tôi nghĩ vậy. –

+1

@ankur, LINQ sử dụng nội bộ lặp lại, vì vậy nó sẽ kiểm tra đối với từng id sinh viên đối với mảng id. Điều này rất hữu ích khi tương tác với cơ sở dữ liệu, vì điều đó sẽ tạo ra một 'Chọn * từ bảng trong đó có loại truy vấn ID (1,2,3)'. Thêm chi tiết về http://wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/ – Habib

4

thử

Var list = studentList.Where(s=>ids.Contains(s.id)).ToList(); 
1

Tôi nghĩ rằng câu trả lời đã được đưa ra sẽ đủ nhanh , nhưng chỉ trong trường hợp sau khi thử nghiệm bạn thấy rằng quá chậm: Bạn có thể thử chuyển đổi danh sách sinh viên sang từ điển trước khi thực hiện tìm kiếm.

Bạn chỉ nên sử dụng điều này sau khi kiểm tra thời gian cẩn thận, vì có thể chậm hơn rất nhiều đối với hầu hết các trường hợp!

public static List<Student> FilteredStudents(int[] targetIds) 
{ 
    var allStudents = GetAllStudents().ToDictionary(student => student.id); 
    var result = new List<Student>(); 

    foreach (int id in targetIds) 
    { 
     Student student; 

     if (allStudents.TryGetValue(id, out student)) 
     { 
      result.Add(student); 
     } 
    } 

    return result; 
} 
Các vấn đề liên quan