2017-04-05 123 views
0

我正在做應用程序。mvc實體框架選擇與動態where子句

我有一個select指令,我需要有dymanic where條件。

這是一個常見的情況,你有一個由「aaaa bbbb cccc」字符串組成的過濾器。我需要將包含所有過濾器字符串或其一部分的所有數據。

我在做它的一部分,它與Split功能,但它很難得到所有可能的組合。

我寧願使用Store Procedure。但它的用途是使用實體框架。

至於我做到了這一點。

public IEnumerable<UploadSearch> GetUploadsBySearch(string search) 
 
     { 
 
      IEnumerable<UploadSearch> viewModel = (from uploads in _db.Uploads 
 
                .Where(p => p.ProcessState_id == Security.APPROVED && p.Finder.Contains(search)) 
 
                .OrderByDescending(p => p.UploadDate) 
 
                select new UploadSearch 
 
                { 
 
                 User_id = uploads.User_id, 
 
                 UserName = uploads.Users.Name, 
 
                 UserLastName = uploads.Users.LastName, 
 
                }); 
 
               

我的指令添加到loop THROU字符串,

string[] param = search.Replace(" "," ").Split(' '); 
 
      string _param = ""; 
 
      int large = param.Length; 
 

 
for (int i=0;i<large-1;i++) 
 
      { 
 
      _param +=param[i] ' ' + param[i + 1]; 
 
      IEnumerable<UploadSearch> _viewModel = (from uploads in _db.Uploads 
 
                .Where(p => p.ProcessState_id == Security.APPROVED && p.Finder.Contains(_param)) 
 
                .OrderByDescending(p => p.UploadDate) 
 
                select new UploadSearch 
 
                { 
 
                 User_id = uploads.User_id, 
 
                 UserName = uploads.Users.Name, 
 
                 UserLastName = uploads.Users.LastName, 
 
                }); 
 
viewModel = viewModel.Union(_viewModel);             
 
                } 
 
               

而且我用的是Union條款。

但必須有另一種方式來做到這一點。

任何想法?

+0

什麼叫「動態」,其中的條件是什麼意思?我不確定我瞭解你的問題。 – jtate

回答

0

你應該使用LinqKit,它有一個PredicateBuilder類,允許你動態地構建查詢

https://github.com/scottksmith95/LINQKit#predicatebuilder

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

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

謝謝,可以用組合來查詢查詢嗎?如果我有3個字,我可以匹配這些字嗎? 1-2,1-3,2-1,2-3,3-2,3-1? – Diego