2011-12-11 112 views
0

我想寫linq to sql查詢有兩個where條件, 但是在所有的條件下都會有select有不同的選擇。 (同類型的兩列,所以我沒有問題,讓他們到該列表。)linq to sql有兩個條件

我想使它看起來像一個正常的狀態:

if (...) 
      // do something - select one column 
    if (...) 
      // do something - select another column 

現在我已經寫了這樣:(A爲參數傳遞給函數,我檢查是否是其中一列 - 如果是,請選擇其他列)

 var q1 = from stud in _context.temps 
       where stud.a == A // this is first condition A==a 
       select stud.b; // here selected column b 
     var q2 = from stud in _context.temps 
       where stud.b == A // this is second condition A==b 
       select stud.a; // here selected column a 
     List<temp> answer = q1.ToList(); 
     answer.AddRange(q2.ToList()); 
     return answer; 

但似乎過於複雜。

+2

這不太清楚你的意思 - 'select'和'where'是非常不同的東西。如果你能給出更具體的例子,那真的會有幫助。 –

+0

你的例子沒有說明「如果」等的上下文......? –

+0

我想在'where'部分通過兩個條件'選擇'不同的列,而不需要兩次在集合上 – zeevblu

回答

3

你的意思是:

IQueryable<string> query; 
if(foo) { 
    query = from row in db.SomeTable 
      where row.Whatever 
      select row.SomeString; 
} else if (bar) { 
    query = from row in db.MaybeAnotherTable 
      select row.AnotherString; 
} ... 

foreach(string s in query) ... 

編輯根據您的更新:

如果你有

IQueryable<string> query1 = ..., query2 = ...; 
IQueryable<string> result = null; 

THN你可以有多種:

if(condition1) { 
    result = result == null ? query1 : result.Concat(query1); 
} 
if(condition2) { 
    result = result == null ? query2 : result.Concat(query2); 
} 
+0

否,我的意思是兩個查詢將在同一張表上,但選擇另一列。作爲我的例子。 – zeevblu

+0

@zeevblu「可能不同的表」只是一個更一般的情況,但工作原理是一樣的。請參閱我的編輯,在您的示例之後添加。 –

1

您可以在select條款中使用第三運營商。看到這個代碼:

Dictionary<string, string> names = new Dictionary<string, string>(); 
names.Add("Saeed", "Neamati"); 
names.Add("Rasour", "Zabihi"); 
names.Add("Vahid", "Asefi"); 
names.Add("Mohsen", "Parmooz"); 

var query = from name in names 
      select name.Key.StartsWith("V") ? name.Key : name.Value; 
query.ToList().ForEach(n => { 
    Console.WriteLine(n); 
}); 
Console.ReadLine(); 

它生產什麼,就是:

Nemati 
Zabihi 
Vahid 
Parmooz 
+0

你的例子不適合我,但在這種情況下,我想選擇所有的項目,其中一個字符串equale到一些字符串 – zeevblu

1

看着你提供的例子,它似乎所有你只需要的是一個工會。如果是這樣的話,下面的代碼就是你正在尋找的東西。

var q1 = (from stud in _context.temps 
     where stud.a == A 
     select stud.b).Union 
      (from studb in _context.temps 
      where stud.b == A 
      select stud.a); 

List<temp> answer = q1.ToList(); 
return answer; 
+0

你的例子和我的例子之間有什麼不同?兩個查詢都會在列表中下兩次。你用'Union'命令連接它們,然後用'AddRange'連接它們。 – zeevblu

+0

@zeevblu:你提供的例子會翻譯成兩個sql調用,一個調用q1.ToList(),另一個調用q2.ToList();我提出的那個會在一箇中做同樣的事情。 – ArunJohney