2017-07-03 78 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