lambda 表达式中的 if 语句和赋值

本文关键字:语句 赋值 if 表达式 lambda | 更新日期: 2023-09-27 18:36:13

我有一个lambda语句,它的映射如下:

public enum Status
{
    Completed,
    InComplete,
    Ok
}

查询:

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

所以我希望 Status 有多个 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。

lambda 表达式中的 if 语句和赋值

你可以嵌套你的三元运算:

Status = c.someQuery() ? Status.Completed : 
    c.someOtherQuery() ? Status.InComplete : Status.Ok 

你能这样做吗?

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...恕我直言)。

由于该逻辑无法转换为 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