如果是lambda表达式中的语句和赋值

时间:2012-06-05 00:59:22

标签: c# linq entity-framework lambda

我有一个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;
                   }
      });

那我怎么做到这样的事呢?我正在使用Entity框架ORM。

3 个答案:

答案 0 :(得分:5)

您可以嵌套三元操作:

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

答案 1 :(得分: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 ...恕我直言)。

答案 2 :(得分: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将针对对象列表执行。