我想用两个linq to sql
条件编写where
个查询,
但在所有条件下,select
都有不同的选择。
(两个相同类型的列,所以我没有问题让他们到那个列表。)
我想让它看起来像正常情况:
if (...)
// do something - select one column
if (...)
// do something - select another column
现在我已经用这种方式写了:( A是传递给函数的参数,我检查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;
但这似乎太复杂了。
答案 0 :(得分: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;
你可能有多个:
if(condition1) {
result = result == null ? query1 : result.Concat(query1);
}
if(condition2) {
result = result == null ? query2 : result.Concat(query2);
}
答案 1 :(得分: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
答案 2 :(得分: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;