0

我有一个具有如下映射的 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。

4

3 回答 3

6

You could nest your ternary operations:

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 中返回一个枚举,而无需嵌套(这是 baaaaaaaad...恕我直言)。

于 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 回答