我正在尝试动态地对对象集合进行排序。理想情况下,我希望它能够执行以下功能,我可以在运行时指定条件。
_group.OrderByDescending(rec => "rec.CalculatedRecord.GL.PropertyValue").Take(Convert.ToInt16(_filters.Value))
我尝试了无效的动态linq。
var query = (from enumerable in _group
orderby "rec.CalculatedRecord.GL.PropertyValue"). descending
select enumerable).Take(5);
答案 0 :(得分:0)
关于为什么第二个不应该工作的注释:枚举对象被称为enumerable
但是在你的字符串中你仍然使用rec
,就像之前的lambda一样。将字符串更改为使用enumerable
代替rec
可能会缓解您的问题。
答案 1 :(得分:0)
OrderByDescending
方法的参数为Func<TSource, TKey>
。虽然您可以在这里插入lambda,这是最常见的用例,但您也可以传入一个变量。可以根据您的逻辑来动态分配变量。
我不得不推断你的班级结构,但这是一个基本的例子:
public class Record
{
public CalculatedRecord CalculatedRecord { get; set; }
}
public class CalculatedRecord
{
public GL GL { get; set; }
}
public class GL
{
public PropertyValue PropertyValue1 { get; set; }
public PropertyValue PropertyValue2 { get; set; }
}
public class PropertyValue { }
然后您可以创建以下逻辑:
public class TestHarness
{
public void Test()
{
IEnumerable<Record> Group = new List<Record>();
//Simple flag
bool someCriteria = true;
//Define orderByFunc
Func<Record, PropertyValue> orderByFunc;
//Assign the order by function based on someCriteria
if (someCriteria)
{
orderByFunc = record =>
record.CalculatedRecord.GL.PropertyValue1;
}
else
{
orderByFunc = record =>
record.CalculatedRecord.GL.PropertyValue2;
}
//Execute OrderBy
var updated = Group.OrderByDescending(orderByFunc).Take(5);
}
}
但是,这不允许您在运行时动态生成Func。为此,您需要使用表达式树构建Expression
然后进行编译。您可以按照Expression.Lambda and query generation at runtime, simplest "Where" example