使用第二个lambda中的一个lambda的逻辑

时间:2015-07-14 06:13:44

标签: c# .net lambda

我已经看过其他问题了,我无法弄清楚如何将答案应用到我的特定情况。假设您有几个看起来像这样的模型:

public class Person
{
    public int PersonId { get; set; }
}

public class Business
{
    public int BusinessId { get; set; }
}

我希望能够编写几个不同的泛型方法:一个使用提供的Lambda获取模型,可能看起来像这样:

GetWhere(p => p.PersonId == 1)

一个使用唯一键获取模型 - 为了使其灵活,我希望能够使用Lambda指定唯一键:

GetByUniqueKey(p => p.PersonId, 1)

或者

GetByUniqueKey(b => b.BusinessId, 1)

理想情况下,GetByUniqueKey只是构建表达式以发送到GetWhere,然后返回FirstOrDefault()结果的简写方法。但这样做的逻辑完全逃避了我。我想做什么:

public IEnumerable<TModel> GetWhere(Expression<Func<TModel, bool>> whereExpression)
{
    // Get from DB using expression provided
}

public TModel GetByUniqueKey<TUniqueKey>(
         Expression<Func<TModel, TUniqueKey>> uniqueKeyProperty,
         TUniqueKey value)
{
    return GetWhere(m => uniqueKeyProperty(m) == value).FirstOrDefault();
}

所以我想采用uniqueKeyProperty表达式,以某种方式在提供的参数上调用它来获取属性,然后whereExpression中使用该属性表达

关于重复问题的说明: 我知道这看起来像是其他类似问题的重复,但请注意我已阅读过这些问题,但我无法弄清楚如何将这些答案应用于我的特定用例。

对回复评论的一些澄清

简单地说,我想做以下事情:

我想取表达式p => p.PersonId和值1,并生成一个whereExpression,看起来像p => p.PersonId == 1。 (谢谢@Rob)

2 个答案:

答案 0 :(得分:1)

您可以从键选择器构建一个新表达式,并提供如下值:

public TModel GetByUniqueKey<TUniqueKey>(
    Expression<Func<TModel, TUniqueKey>> uniqueKeySelector,
    TUniqueKey value)
{
    return GetWhere(Expression.Lambda<Func<TModel,bool>>(
        Expression.MakeBinary(
            ExpressionType.Equal,
            uniqueKeySelector.Body,
            Expression.Constant(value, typeof(TUniqueKey))),
        uniqueKeySelector.Parameters));
}

对于ID查询,我不打扰这种方法。查看Expression class上的其他静态方法。

答案 1 :(得分:0)

显然你想要实现某种多态性,一种可能性是让PersonBusiness从同一个基类继承或从同一个接口继承并共享一个{{1属性。你可以定义

Id

并使public class Identifiable { public int Id { get; set; } } Person继承自。然后是回调

Business
可以为两个类的对象调用

。但是,必须更改原始类才能使该方法起作用。