我已经看过其他问题了,我无法弄清楚如何将答案应用到我的特定情况。假设您有几个看起来像这样的模型:
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)
答案 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)
显然你想要实现某种多态性,一种可能性是让Person
和Business
从同一个基类继承或从同一个接口继承并共享一个{{1属性。你可以定义
Id
并使public class Identifiable
{
public int Id { get; set; }
}
和Person
继承自。然后是回调
Business
可以为两个类的对象调用。但是,必须更改原始类才能使该方法起作用。