2011-12-11 55 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