web-dev-qa-db-ja.com

LINQのその他の場合

LINQクエリでIf Else条件を使用することはできますか?

何かのようなもの

from p in db.products
if p.price>0
select new
{
  Owner=from q in db.Users
        select q.Name
}
else
select new
{
   Owner = from r in db.ExternalUsers
            select r.Name
}
38
Graviton

これはうまくいくかもしれない...

from p in db.products
    select new
    {
        Owner = (p.price > 0 ?
            from q in db.Users select q.Name :
            from r in db.ExternalUsers select r.Name)
    }
59
Richard Everett

dbから、これはLINQ-to-SQL/Entity Framework /類似(LINQ-to-Objectsではない)であると想定しています。

一般に、条件付き構文(a?b:c)の方が優れていますが、そのようなさまざまなクエリで動作するかどうかはわかりません(結局、TSQLをどのように記述しますか?)。

あなたがcanすることのタイプの些細な例:

select new {p.PriceID, Type = p.Price > 0 ? "debit" : "credit" };

もっと豊かなことはできますが、条件式でtableを選択できるとは本当に思えません。もちろん、試してみてください...

8
Marc Gravell

上記の回答は、複雑なLinq式には適していません。あなたが必要なのは:

// set up the "main query"
var test = from p in _db.test select _db.test;
// if str1 is not null, add a where-condition
if(str1 != null)
{
    test = test.Where(p => p.test == str);
}
3
Cheung

次のように変更する必要があります。

private string getValue(float price)
{
    if(price >0)
        return "debit";
    return "credit";
}

//Get value like this
select new {p.PriceID, Type = getValue(p.Price)};
1
Lucascio Phan

私の例:

 companyNamesFirst = this.model.CustomerDisplayList.Where(a => a.CompanyFirst != null ? a.CompanyFirst.StartsWith(typedChars.ToLower())) : false).Select(b => b.CompanyFirst).Distinct().ToList();
1
Bianca Kalman
 var result = _context.Employees
                .Where(x => !x.IsDeleted)
                .Where(x => x.ClientId > (clientId > 0 ? clientId - 1 : -1))
                .Where(x => x.ClientId < (clientId > 0 ? clientId + 1 : 1000))
                .Where(x => x.ContractorFlag == employeeFlag);
            return result;

ClientId = 0の場合、すべての従業員が必要です。ただし、1〜999のclientIdには、そのIDを持つクライアントのみが必要です。私は別々のLINQステートメントが同じではないという問題を抱えていました(削除/クライアントフィルターはすべてのクエリにある必要があります)ので、これらの2行を追加することで動作します(すべて999以上のクライアントがあるまでそれは幸せです) -ファクターデー!!

0