linq to sql有两个条件

时间:2011-12-11 08:58:00

标签: c# linq-to-sql

我想用两个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;

但这似乎太复杂了。

3 个答案:

答案 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;