2017-07-03 59 views
0

我有一个这样的对象:基于空参数Linq查询建设

public class Filters 
{ 
    List<string> A { get; set; } 
    List<string> B { get; set; } 
} 

我将用它作为将在数据库执行查询的功能参数。 这些itens,A和B将指示“where”过滤器。

请看下面的代码:

//Filters Initialization 
Filters TestFilters = new Filters(); 
TestFilters.A = new List<string>(); 
TestFilters.B = new List<string>(new string[] {"testfilter1","testfilter2"}); //WHERE B == "testfilter1" OR B == "testfilter2" 

//Call of the function that executes SELECT on DB 
List<Table> Result = TestFunction(TestFilter); 

功能:

public static List<Table> TestFunction(Filters pParameter) 
{ 
    ExampleDataContext dc = new ExampleDataContext(Properties.Settings.Default.ExampleConnectionString); 
    List<Table> SelectResult = new List<Table>(); 

    if (pParameter.A.count != 0 && pParameter.B.count != 0) 

     SelectResult = (from x in dc.Table 
      where pParameter.A.Contains(x.A) 
      where pParameter.B.Contains(x.B) 
      select x).ToList(); 

    else if (pParameter.A.count == 0 && pParameter.B.count != 0) 
    { 
     SelectResult = (from x in dc.Table 
      where pParameter.B.Contains(x.B) 
      select x).ToList(); 
    } 

    else if (pParameter.A.count != 0 && pParameter.B.count == 0) 
    { 
     SelectResult = (from x in dc.Table 
      where pParameter.A.Contains(x.A) 
      select x).ToList(); 
    } 

    else if (pParameter.A.count == 0 && pParameter.B.count == 0) 
    { 
     SelectResult = (from x in dc.Table 
      select x).ToList(); 
    }  

    return SelectResult; 
} 

有时A或/和B是/都是空的,那么我使用 “IF” 结构来处理它。 也许我可能会遇到一个问题,即我的过滤器更大,超过2个参数,编码会很困难/无聊。 我的问题是:它正在工作,但有没有另一种方式来做到这一点,而不是使用IF?

+0

你应该使用链式LINQ查询,这是与新的查询继续旧的查询结果。你不应该每次都在x上查询。 –

回答

0

我已经尝试了一些选项,但没有成功。 下面你可以找到为我工作的代码:

List<Table> SelectResult = (from x in dc.Table 
          where (pParameter.A.Count != 0 ? pParameter.A.Contains(x.A) : true) 
          where (pParameter.B.Count != 0 ? pParameter.B.Contains(x.B) : true) 
          select s).ToList(); 
0

你可以做这样的事情:

SelectResult = (from x in dc.Table 
      where pParameter.A.Any() && pParameter.A.Contains(x.A) 
      where pParameter.B.Any() && pParameter.B.Contains(x.B) 
      select x).ToList(); 
1

请试用(链接LINQ),我只是用手工改写,并没有编译或运行:

 public static List<Table> TestFunction(Filters pParameter) 
    { 
     ExampleDataContext dc = new ExampleDataContext(Properties.Settings.Default.ExampleConnectionString); 
     var SelectResult = dc.Table; 

     if (pParameter.A.count != 0) 
      SelectResult = from x in SelectResult 
          where pParameter.A.Contains(x.A) 
          select x; 

     if (pParameter.B.count != 0) 
     { 
      SelectResult = from x in SelectResult 
          where pParameter.B.Contains(x.B) 
          select x; 
     } 
     return SelectResult.ToList(); 
    } 
0

的代码很简单。只需使用正确的LINQ语法。

//Parameters class 
public Class Parameters 
{ 
    public List<string> A {get; set;} 
    public List<int> B {get; set;} 
} 

//some function in a controller 
public List<SomeResult> GetResult(Parameters pars) 
{ 
    var db = new DbContext(); 
    var result = db.SomeResult.Where(s => s.Any(p =>p.SomeString == pars.A 
        || p.SomeInt == pars.B)) 
      .ToList(); 
    return result; 
} 
+0

嗨亚历克斯,我已经尝试过,但“任何”不可用。你确定? –

0

IQueryable<Table>与仅在BUTTOM线(类型dc.Tabledc.Table.Where()),可以链的标准,和出口ToList。

所以如果同比变动的SelectResultList<Table>IQueryable<Table>, 每个标准可以链接到以前的表达,它是仿佛完成,:

public static List<Table> TestFunction(Filters pParameter) 
{ 
    ExampleDataContext dc = new ExampleDataContext(Properties.Settings.Default.ExampleConnectionString); 

    //all 
    IQueryable<Table> SelectResult = dc.Table; 

    //add conditions 
    if (pParameter.A.count != 0) 
     SelectResult = SelectResult.Where(x => pParameter.A.Contains(x.B)); 
    if (pParameter.B.count != 0) 
     SelectResult = SelectResult.Where(x => pParameter.A.Contains(x.B)); 

    //export, with one\two\zero conditions 
    return SelectResult.ToList(); 
} 

如果你的情况比较复杂(如多个条件和OR操作符)考虑使用美妙的工具PredicateBuilder