所以我一直在寻找一个简单的例子,希望这是一个简单的问题。
我有一个简单的对象List of ListTest(List)
public class ListTest{
{
public string perName { get; set; }
public string perSex { get; set; }
public ListTest(string pName, string pSex)
{
this.perSex = pSex;
this.perName = pName;
}
}
我已经加载了一些数据:
List<ListTest> tryIt = new List<ListTest>();
tryIt.Add(new ListTest("Karen", "F"));
tryIt.Add(new ListTest("Kate", "F"));
tryIt.Add(new ListTest("Glen", "M"));
tryIt.Add(new ListTest("Tiger", "M"));
tryIt.Add(new ListTest("Clementine", "F"));
tryIt.Add(new ListTest("Magnolia", "F"));
现在我想使用Lambda Expression查询它:
var things = tryIt
.Where(sex => (sex.perSex == "F"))
.OrderBy(sex => sex.perName);
但我想动态地做,以防万一我想改变“perName”的位置。
我能够创建Lambda Expression你的表达式,但我无法弄清楚如何跨越目标线并将其实际分配给where子句并执行它。
IQueryable<ListTest> iq = tryIt.AsQueryable();
ParameterExpression pe = Expression.Parameter(typeof(ListTest), "Person");
Expression paEx = Expression.Property(pe, "perSex");
Expression right = Expression.Constant("F");
Expression eqEx = Expression.Equal(paEx, right);
Expression lE = Expression.Lambda<Func<ListTest, bool>>(eqEx, pe);
这应该是一个简单的4或5行解决方案,但我找不到一个容易破解的解决方案示例。
我应该在这些行中使用MethodCallExpression吗?
谢谢,
答案 0 :(得分:1)
您可以尝试这样的事情:
IEnumerable<ListTest> things = tryIt;
if (someBooleanLogic)
things = things.Where(l => l.perSex == "F");
else
things = things.Where(l => l.perName == "Tiger");
things = things.OrderBy(sex => sex.perName);
List<ListTest> filteredAndSorted = things.ToList();
修改强>
或者,也有流行的LINQ Dynamic Query Library,您可以根据需要形成您的查询(当然是动态的)。
答案 1 :(得分:0)
我在post找到了最优雅的解决方案。它允许我构建一个非常灵活和清晰的解决方案,而不会陷入参数地狱。