2011-04-04 57 views
2

我有一個數據庫,有一個「動態」的用戶搜索屏幕,因爲我可以根據搜索所基於的特定視圖中可用的列可以動態添加其他搜索條件並且它將允許用戶立即使用它們。以前我一直在使用這個數據庫的nettiers,但現在我正在使用RIA和EntFramework 4和LINQ來編寫一個新的應用程序。Linq動態查詢用戶搜索屏幕

我現在有一個用於此兩個表,一個填充與現有的搜索字符串模式的組合框:

姓氏 姓氏,名字 電話 等....

然後我有一個表將這些標準分開,並用於我的nettiers算法中。它運行良好,但我想使用LINQ..and它不適合這個模型很好。此外,我想我可以使用類似於此或極爲類似的格式削減下來到只有一個表使用LINQ ...

...

ID標準WhereClause 1姓氏「姓LIKE」%{ 0}%」

現在我知道這不會適合專門到LINQ query..but我試圖用爲清楚起見這裏萬能語法...

真正的where子句會是這個樣子: a => a.LastName.Contains(「{0}」)

我的第一個問題是:這甚至有可能嗎?將一個lambda放入一個字符串並在Linq查詢中使用它?

我的第二個問題是:在我研究這一點之前,我發現了一個linq語法,它有一個類似它的前綴.LastName {0} 我似乎嘗試過使用它,因爲它的痕跡仍然存在我的測試數據庫...但我不知道回憶我在哪裏讀到它。

有人這樣做嗎?我已經做了一些搜索,發現類似occurances但他們大多有靜態字段是可選的,不完全的方式我這樣做......

回答

1

關於你提到的第一個問題,你可以做到這一點使用LINQ的動態,通過描述斯科特谷here

var query = Northwind.Products.Where("Lastname LIKE "test%"); 
+0

這是最接近的解決方案。事實上,你必須將其更改爲 VAR的查詢= Products.Where(「Lastname.Contains(」測試「));否則,你得到一個不返回布爾錯誤 – ecathell 2011-04-04 20:25:31

1

我不知道您的動態查詢如何詳細的需求是,但是當我需要做動態查詢,我創建了一個類來表示過濾器值。然後,我將該類傳遞給我的存儲庫上的搜索方法。如果字段的值爲空,則查詢會忽略它。如果它有一個值,它會添加適當的過濾器。

public class CustomerSearchCriteria{ 
    public string LastName { get; set; } 
    public string FirstName { get; set; } 
    public string PhoneName { get; set; } 
} 


public IEnumberable<Customer> Search(CustomerSearchCriteria criteria){ 
    var q = db.Customers(); 

    if(criteria.FirstName != null){ 
     q = q.Where(c=>c.FirstName.Contains(criteria.FirstName)); 
    } 

    if(criteria.LastName!= null){ 
     q = q.Where(c=>c.LastName.Contains(criteria.LastName)); 
    } 

    if(criteria.Phone!= null){ 
     q = q.Where(c=>c.Phone.Contains(criteria.Phone)); 
    } 
    return q.AsEnumerable(); 
} 
+0

如前所述,應用程序完全不認識的查詢條件的內容如果我選擇根據我的視圖添加額外的標準選擇,我也必須編輯我的代碼,我不想這樣做。 – ecathell 2011-04-04 19:58:41