我有一个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。
答案 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
将针对对象列表执行。