2013-08-09 23 views
5

Tôi có một biểu mẫu lọc dữ liệu tùy thuộc vào những gì họ chọn.Làm cách nào để nối các truy vấn LINQ với nhau?

Tôi đang cố gắng thêm các truy vấn LINQ vào nhau để kết quả cuối cùng là những gì chúng đã chọn trên màn hình.

Đây là mã của tôi:

private void button_Search_Click(object sender, EventArgs e) 
{ 
    using (var model = new SuburbanPortalEntities()) 
    { 
    var qry = from logs in model.Logs 
       select logs; 

    Guid corpid; 
    if (Guid.TryParse(textBox_CorporationGuid.Text, out corpid)) 
    { 
     qry = from logs in model.Logs 
       where logs.CorporationId == corpid 
       select logs; 
    } 

    Guid tokenid; 
    if (Guid.TryParse(textBox_TokenId.Text, out tokenid)) 
    { 
     qry = from logs in model.Logs 
      where logs.TokenId == tokenid 
      orderby logs.LogDateTime descending 
      select logs; 
    } 

    if (checkBox_DisplayErrors.Checked) 
    { 
     qry = from logs in model.Logs 
      where logs.IsException 
      select logs; 
    } 

    if (checkBox_DisplayWarnings.Checked) 
    { 
     qry = from logs in model.Logs 
      where logs.IsWarning 
      select logs; 
    } 

    dataGridView1.DataSource = qry; 


    } 
} 

Tôi không có may mắn. Các qry cuối cùng là những gì được hiển thị trên datagridview của tôi.

Ai đó có thể cho tôi biết tôi đang làm gì sai không?

Cảm ơn!

+0

Từ truy vấn thứ 2 của bạn, bạn có thể truy vấn từ kết quả trả về từ truy vấn trước đó. – zsong

+0

Bạn đang ghi đè biến 'qry' với một kết quả mới mỗi lần, không giống như làm' int a = 0; a = 1; ' – sinelaw

Trả lời

8

Điều đang xảy ra ở đây là bạn định nghĩa lại qry từ dữ liệu nguồn của mình mỗi lần. qry là một IEnumerable<T> chỉ giống như logs, vì vậy bạn sẽ có thể thay thế mã của bạn như sau:

var qry = model.Logs; 

if(// Condition) 
    qry = qry.Where(x => x.CorporationId == corpId); 

if(// Another condition) 
    qry = qry.Where(x => x.IsException); 

Vào cuối của thiết lập này, qry sẽ là thành phần của tất cả các lựa chọn Where khoản và nên sản xuất chỉ các mục bạn đang tìm kiếm.

+0

đây là những gì tôi đang tìm kiếm! Cảm ơn Tejs – ErocM

+3

'qry' là một' IQueryable ', không phải là một 'IEnumerable '. (Mặc dù 'IQueryable ' kế thừa từ 'IEnumerable '.) Đó là một sự khác biệt rất quan trọng. – Servy

5

Bạn có thể sử dụng LINQ Concat:

qry = qry.Concat(
      from logs in model.Logs 
      where logs.CorporationId == corpid 
      select logs); 

Mặt khác, bạn có thể muốn tạo truy vấn dựa trên điều kiện của bạn mà sẽ chọn kết quả thích hợp, vì vậy bạn sẽ truy vấn nguồn dữ liệu của bạn một lần.

+1

OP có thể muốn [Concat] (http://msdn.microsoft.com/en-us/library/bb302894.aspx) (bổ sung kết quả) thay vì Union (thực hiện một liên minh đã đặt) – sinelaw

+0

Cảm ơn, tôi đã chỉnh sửa câu trả lời của tôi để bao gồm phương pháp 'Concat' vì điều này thực sự có thể là những gì OP muốn. – Zbigniew

+0

Lưu ý rằng, tùy thuộc vào các chi tiết cụ thể có liên quan, việc sử dụng 'Concat' sẽ không nhất thiết liên quan đến hai truy vấn DB. Các truy vấn có thể được kết hợp bởi nhà cung cấp truy vấn và dẫn đến một truy vấn được gửi đến cơ sở dữ liệu. – Servy

0

Tôi có thể khuyên bạn nên sử dụng chức năng Predicate Builder trong LinqKit. Bạn có thể nối thêm các tham số tìm kiếm bổ sung bằng cách sử dụng các phương thức And và Or.

Tôi đã sử dụng chính xác mục đích này và hoạt động rất tốt.

0

Hãy thử sử dụng concat:

private void button_Search_Click(object sender, EventArgs e) 
{ 
    using (var model = new SuburbanPortalEntities()) 
    { 
    var qry = (from logs in model.Logs 
       select logs).ToList(); 

Guid corpid; 
if (Guid.TryParse(textBox_CorporationGuid.Text, out corpid)) 
{ 
    qry.Concat((from logs in model.Logs 
      where logs.CorporationId == corpid 
      select logs).ToList()); 
} 

Guid tokenid; 
if (Guid.TryParse(textBox_TokenId.Text, out tokenid)) 
{ 
    qry.Concat(from logs in model.Logs 
     where logs.TokenId == tokenid 
     orderby logs.LogDateTime descending 
     select logs).ToList()); 
} 

if (checkBox_DisplayErrors.Checked) 
{ 
    qry.Concat((from logs in model.Logs 
     where logs.IsException 
     select logs).ToList()); 
} 

if (checkBox_DisplayWarnings.Checked) 
{ 
    qry.Concat((from logs in model.Logs 
     where logs.IsWarning 
     select logs).ToList()); 
} 

dataGridView1.DataSource = qry; 

}}

Các vấn đề liên quan