2012-01-16 28 views
8

Tôi có truy vấn LINQ sau:LINQ FirstOrDefault

Manager mngr = (from tr in DataContext.Manager 
        where tr.Name = "Jones").FirstOrDefault(); 

Làm thế nào tôi có thể kiểm tra nếu truy vấn đã trở lại 1 kỷ lục như tôi không thể làm Count để lấy số liệu.

+3

Xem tài liệu về phương pháp FirstOrDefault. Nó trả về giá trị mặc định cho kiểu dữ liệu nếu không có kết quả. Nếu đó là một điều phải * không quá 1 * bản ghi vượt qua các tiêu chí truy vấn, sử dụng SingleOrDefault thay thế. –

Trả lời

14

Trước hết, đó không phải là truy vấn hợp lệ. Khi bạn sử dụng cú pháp truy vấn (from blah in blah ...), bạn phải có mệnh đề select. Nó nên được như thế hơn:

var manager = 
    (from n in DataContext.Manager 
    where n.Name == "Jones" 
    select n).FirstOrDefault(); 

Để trả lời câu hỏi của bạn, gọi FirstOrDefault() trên truy vấn của bạn sẽ trả lại kết quả đầu tiên của truy vấn hoặc giá trị mặc định cho các loại hình (có khả năng nhất null trong trường hợp này). Đối với những gì bạn đang đi, điều này sẽ không được sử dụng đầy đủ vì truy vấn có thể chứa nhiều hơn một kết quả.

Nếu bạn muốn xác minh rằng truy vấn chỉ trả về một kết quả, bạn nên sử dụng phương thức SingleOrDefault() để thay thế. Nó sẽ trả về một mục do truy vấn tạo ra, giá trị mặc định null nếu nó trống hoặc ném một ngoại lệ nếu có nhiều hơn một mục.

Nếu bạn không muốn ném ngoại lệ, có thể dễ dàng ném hai kết quả đầu tiên vào danh sách và xác minh rằng bạn chỉ có một kết quả.

var managers = 
    (from m in DataContext.Manager 
    where m.Name == "Jones" 
    select m).Take(2).ToList(); 
if (managers.Count == 1) 
{ 
    // success! 
    var manager = managers.First(); 
    // do something with manager 
} 
else 
{ 
    // error 
} 
+0

Cách tôi đã làm là nói nếu (mngr! = Null) {.. chúng tôi biết là chúng tôi đã thuê 1 bản ghi} –

+0

Ngoài ra còn có một .Single() để kiểm tra bạn có ** chính xác ** một bản ghi – PPC

+0

- 1 cho thấy rằng ném kết quả vào một danh sách và đếm sẽ là một giải pháp thích hợp. Làm như vậy trên các tập hợp kết quả lớn hoặc nơi một bảng lớn phải được đi qua để lấy tất cả các dữ liệu sẽ rất xấu. Cả hai đầu tiên và đơn làm tối ưu hóa phụ trợ mà không thể được nhân rộng với đề xuất của bạn. –

0

Bạn có thể sử dụng phương thức mở rộng SingleOrDefault để thể hiện rằng truy vấn chỉ bao giờ nên trả về một kết quả.

Manager manager = (from tr in DataContext.Manager 
        where tr.ID = "2323").SingleOrDefault(); 

Tuy nhiên nó không cho bạn biết liệu bạn có 0 kết quả hoặc hơn 1.

0

Nếu bạn muốn đếm các hồ sơ, đếm kết quả của truy vấn mà không FirstOrDefault.

var mngr = (from tr in DataContext.Manager 
       where tr.ID = "2323") 
if(mngr.Count() == 0) 
    .... 
else 
    Manager manager = mngr.First(); //No need for default since we know we have a record. 

Bạn vẫn có thể chạy đầu tiên hoặc mặc định trên mngr để tải người quản lý cụ thể.

0

Bạn đang sử dụng ID cho điều kiện where, tôi nghĩ bạn nên chắc chắn rằng truy vấn này chỉ trả về một kết quả.

Nếu sự cố của bạn không có kết quả, vui lòng kiểm tra việc sử dụng FirstOrDefault() từ MSDN title.

  int[] numbers = { }; 
      int first = numbers.FirstOrDefault(); 
      Console.WriteLine(first); 

      /* 
      This code produces the following output: 

      0 
      */ 
Các vấn đề liên quan