簡體   English   中英

LINQ to SQL-PredicateBuilder

[英]LINQ to SQL - PredicateBuilder

關於如何從PredicateBuilder中獲得更多收益的快速問題。 它按以下方式工作:

IQueryable<Product> SearchProducts (params string[] keywords)
{
  var predicate = PredicateBuilder.False<Product>();

  foreach (string keyword in keywords)
  {
    string temp = keyword;
    predicate = predicate.Or (p => p.Description.Contains (temp));
  }
  return dataContext.Products.Where (predicate);
}

問題是,如果我也想按任意成員進行搜索,即將函數string []作為關鍵字傳遞,還要傳遞要搜索的字段(例如fieldToSearch)並替換p => p.Description,該怎么辦?包含(temp)); 允許通過fieldToSearch搜索的內容?

這可能嗎,這是一個壞主意嗎?

對於您想做的事情, 動態Linq可能更合適。

盡管編寫類型安全查詢在大多數情況下非常有用,但在某些情況下,您需要靈活地動態地動態構建查詢。 例如:您可能希望在應用程序中提供商業智能UI,以允許最終用戶業務分析師使用下拉菜單來構建和表達自己的自定義查詢/視圖(基於數據)。

傳統上,通常通過將字符串連接在一起以構造動態SQL查詢來處理這些類型的動態查詢方案。 最近,一些人給我發送了郵件,詢問如何使用LINQ處理這些類型的場景。 下面的文章描述了如何使用LINQ團隊提供的動態查詢庫來動態構造LINQ查詢。

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

為什么不使用將Expression<Func<Product,bool>>作為參數的單獨方法。 然后在方法外部構建謂詞,並將其作為參數傳遞。

IQueryable<Product> SearchProducts (Expression<Func<Product,bool>> selector )
{
    return dataContext.Products.Where( selector );
}

用作

var selector = PredicateBuilder.False<Product>()
                               .Or( p => p.Name == name )
                               .Or( p => p.Vendor == vendor );

products = repository.SearchProducts( selector );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM