2013-04-09 87 views
15

Tôi có dòng sau trong C#:LINQ với bí danh

var name = (from x in db.authors 
        where fullName == "Jean Paul Olvera" 
        orderby x.surname 
        select new { x.id_author, fullName= String.Concat(x.name," ", x.surname) }); 

vấn đề của tôi là tôi muốn sử dụng bí danh trong mệnh đề where của tôi, nhưng tôi không thể, 'FullName' xuất hiện như không khai báo.

Trả lời

29

Bạn có thể sử dụng let để tạo ra các giá trị trung gian:

var name = (from x in db.authors 
      let fullName = x.name + " " + x.surname 
      where fullName == "Jean Paul Olvera" 
      orderby x.surname 
      select new { x.id_author, fullName }); 
+0

có thể định nghĩa một bí danh cho 'fullname'? –

+0

@combo_ci Tôi không hiểu câu hỏi của bạn. Đó chính xác là những gì mã này làm. – cdhowie

6

Bạn chưa tạo.

Điều đó đang được nói, kể từ khi bạn biết tên trước, bạn sẽ có thể để thực hiện các truy vấn trên các phần:

var name = from x in db.authors 
       where name == "Jean Paul" && surname == "Olvera" 
       orderby x.surname 
       select new { x.id_author, fullName= String.Concat(x.name," ", x.surname) }; 

Nếu không, bạn có thể sử dụng let để làm điều này:

var name = from x in db.authors 
      let fullName = String.Concat(x.name," ", x.surname) 
      where fullName == "Jean Paul Olvera" 
      orderby x.surname 
      select new { x.id_author, fullName=fullName) }; 
10

Bạn cần phải đặt một phần của dự báo trước đó, đó là dễ dàng với một let clause:

var name = from x in db.authors 
      let fullName = x.name + " " + x.surname 
      where fullName == "Jean Paul Olvera" 
      orderby x.surname 
      select new { x.id_author, fullName }; 

Lưu ý rằng x.name + " " + x.surname sẽ được biên dịch vào mã giống như String.Concat(x.name, " ", x.surname), nhưng là dễ đọc hơn đối với hầu hết mọi người. Cũng lưu ý rằng khi bạn không làm bất cứ điều gì bên ngoài dấu ngoặc đơn (), không cần thiết cho chúng.

Tôi sẽ hy vọng rằng bất kỳ nhà cung cấp LINQ SQL tốt nào sẽ chuyển truy vấn này thành truy vấn SQL hợp lý và hiệu quả, nhưng bạn nên xác thực điều này. Mặt khác, tôi sẽ thường là đề xuất việc yêu cầu truy vấn trên các trường riêng lẻ, ví dụ:

where x.name == "Jean Paul" && x.surname == "Olvera" 
2

sử dụng let khoản:

var name = (from x in db.authors 
       let fullName = String.Concat(x.name," ", x.surname) 
       where fullname = "Jean Paul Olvera" 
       orderby x.surname 
       select new { x.id_author, fullName }); 
2

Đó là dễ dàng hơn trong cú pháp phương pháp, như bạn đang không bị ràng buộc với trật tự của các hoạt động:

var query = authors.OrderBy(x => x.surname) 
    .Select(x => new 
    { 
     x.id_author, 
     fullName = String.Concat(x.name, " ", x.surname) 
    }) 
    .Where(x => x.fullName == "Jean Paul Olvera"); 
3
linq1DataContext ll = new linq1DataContext(); 
      if (comboBox1.SelectedIndex == 0) 
      { 

       var q = from m in ll.personals        



         let کد= m.id 
         let نام = m.name 

         select new { 
            کد, 
            نام, 
         }; 
       dataGridView1.DataSource = q; 
      } 
+0

có thể xác định một bí danh như 'نام و نام خانوادگی'? –