2017-04-05 122 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