2011-02-23 74 views
-2

我有這樣的方法:LINQ構建

的parameteres可以爲空

public string getAll(string d1, string d2, string d3){ 
    Do the linq 
} 

我想要做一個LINQ查詢,如果D1是沒有空,另一如果D2不null,另一個如果d1和d2不爲空,並且所有可能的convinations爲參數。

我不想這樣做。

if(d1 != null) 
//linq opt1 
if(d2 != null 
//linq opt2 
if(d1 != null && d2 != null) 
//linq opt3 

請:(

+0

你有什麼問題,除了它會有點雜亂的代碼? – 2011-02-23 19:43:58

+0

是的,在一行「代碼行」中沒有辦法做到這一點? – Caipivara 2011-02-23 19:47:56

+8

如果添加第四個參數,上帝會幫助你。 – 2011-02-23 19:48:18

回答

0
public string getAll(string d1, string d2, string d3){ 
    if (d1 == null) 
     //Do LINQ 
    if (d2 == null) 
     //Do LINQ 
    if (d3 == null) 
     //Do LINQ 

     if (d1 == null && d2 == null && d3 != null) 
     //Do LINQ 
     if (d1 == null && d2 != null && d3 == null) 
     //Do LINQ 
     if (d1 != null && d2 == null && d3 != null) 
     //Do LINQ 
} 

這不是複製和粘貼,但你應該得到的想法需要做一些檢查,使這兩個羣體不執行

+0

這是我想要避開的wath;) – Caipivara 2011-02-23 19:50:36

+0

想一想,你還會怎麼做。你需要檢查每個參數。你可以使用幾個開關來使它更優雅,但你仍然會寫一些代碼。 – 2011-02-23 19:53:09

+0

:(3!posibilities?如果我有8個參數,那麼我必須寫8!posibilities ????? – Caipivara 2011-02-23 20:18:59

2

通常這些類型的問題中的查詢具有一些共同性(否則,爲什麼使用一種方法?)。也許您正在尋找條件過濾。

public string getAll(string d1, string d2, string d3) 
{ 
    using(CustomDataContext dc = new CustomDataContext()) 
    { 
    IQueryable<Customer> query = dc.Customers; 
    if (d1 != null) 
    { 
     query = query.Where(c => c.Name.StartsWith(d1)); 
    } 
    if (d2 != null) 
    { 
     query = query.Where(c => c.Orders.Any(o => o.OrderNumber == d2)); 
    } 
    if (d3 != null) 
    { 
     query = query.Where(c => c.FavoriteColor == d3); 
    } 
    query = 
     from c in query 
     order c by c.Name 
     select c; 

    List<Customer> results = query.Take(5).ToList(); 
    string answer = SomeMethod(results); 
    return answer; 
    } 
} 
0

對於在一行中做它,你可以使用嵌套的三元語句的緣故...

var result = d1==null?d2==null?/*Linq when both are null*/:/*Linq when d1 is null but d2 isn't*/:/*linq when neither d1 and d2 are null*/; 

這個例子不具有3個參數,而是自顧自地離開築巢:)