0

次のようなマッピングを持つラムダステートメントがあります。

public enum Status
{
    Completed,
    InComplete,
    Ok
}

クエリ:

var courses = query.Select(c => new SomeModel
      {
          Status = c.someQuery() ? Status.Completed : Status.Ok
      });

したがって、Status には 3 項演算だけでなく、複数の if ステートメントが必要です。たとえば。

var courses = query.Select(c => new SomeModel
      {
          Status = if(c.someQuery())
                   { 
                       return Status.Completed;
                   }
                   else if(c.someOtherQuery())
                   {
                       return Status.InComplete;
                   }
                   else if(c.someOtherQuery1())
                   {
                       return Status.Ok;
                   }
      });

では、どうすればこのようなことを達成できますか? エンティティ フレームワーク ORM を使用しています。

4

3 に答える 3

6

三項演算をネストできます。

Status = c.someQuery() ? Status.Completed : 
    c.someOtherQuery() ? Status.InComplete : Status.Ok 
于 2012-06-05T01:05:40.853 に答える
2

ひょっとして、こんな風にできませんか?

myObjects
        .Where(d => d.isTrue == true && d.Value == 77)
        .Update(e => { e.Value = 1; e.isTrue = false; } );

私の linq は慎重に使用してください。いつでも爆発する可能性があります ;-)

    /// <summary>
    /// Used to modify properties of an object returned from a LINQ query
    /// </summary>
    /// <typeparam name="TSource">The type of the source.</typeparam>
    /// <param name="input">The source</param>
    /// <param name="updater">The action to perform.</param>
    public static TSource Update<TSource>(this TSource input, Action<TSource> updater)
    {
        if (!updater.IsNull() && !input.IsNull())
        {
            updater(input);
        }
        return input;
    }

これを完全に説明するには:

    public DataRow DoSomething(DataRow dataRow)
    {
        //DoSomething
        return dataRow;
    }

    var query = from dataRow in myDataTable.Rows.Cast<DataRow>()
                where
                    Double.TryParse(dataRow["Distance"].ToString(), out distance)
                    && distance > (11) && distance <= 99
                select dataRow.Update(f => DoSomething(f));

したがって、メソッド(someOtherQuery)を実行し、ネストなしでLINQ内で列挙型を返すことができます(これはbaaaaaaad ... IMHOです)。

于 2012-06-05T01:11:09.447 に答える
1

そのロジックは T-SQL ステートメントに変換できなかったため、メモリ内で行う必要があります。私がすることは、そのロジックをモデルに追加することです:

var courses = query.ToList().Select(c => new SomeModel
  {
      Status = c.GetStatus();
  });

public class SomeModel 
{
   ...

   public Status GetStatus()
   {
      if(this.someQuery())
      { 
          return Status.Completed;
      }
      else if(this.someOtherQuery())
      {
           return Status.InComplete;
      }
      else if(this.someOtherQuery1())
      {
          return Status.Ok;
      }
      ...
   }
}

呼び出すToList()と、EntityFramework を使用してクエリSelectが実行され、オブジェクト リストに対して実行されることに注意してください。

于 2012-06-05T01:19:13.057 に答える