C# 如何用表达式参数c实现方法#
我想创建这样一个方法:C# 如何用表达式参数c实现方法#,c#,.net,linq,C#,.net,Linq,我想创建这样一个方法: var result = database.Search<EntityType>(x=>x.Name, "Entity Name field value"); result = database.Search<EntityType>(x=>x.Id, "Entity Id field value"); result = database.Search<EntityType2>(x=>x.Id, "Entity2 Id
var result = database.Search<EntityType>(x=>x.Name, "Entity Name field value");
result = database.Search<EntityType>(x=>x.Id, "Entity Id field value");
result = database.Search<EntityType2>(x=>x.Id, "Entity2 Id field value");
result = database.Search<EntityTypeAny>(x=>x.FieldAny, "EntityAny FieldAny value");
var result=database.Search(x=>x.Name,“实体名称字段值”);
结果=database.Search(x=>x.Id,“实体Id字段值”);
结果=database.Search(x=>x.Id,“Entity2id字段值”);
结果=database.Search(x=>x.FieldAny,“EntityAny-FieldAny-value”);
如何实现此方法?是否希望类型是动态的
public ReturnType Read<ReturnType>(string FieldName, object dfVal)
{
if (Res.IsDBNull(Res.GetOrdinal(FieldName)))
return dfVal;
try {
return (ReturnType)Res.GetValue(Res.GetOrdinal(FieldName));
} catch (Exception ex) {
return dfVal;
}
}
public ReturnType读取(字符串字段名,对象dfVal)
{
if(Res.IsDBNull(Res.GetOrdinal(FieldName)))
返回dfVal;
试一试{
return(ReturnType)Res.GetValue(Res.GetOrdinal(FieldName));
}捕获(例外情况除外){
返回dfVal;
}
}
我只能想到这一点(有两个通用参数)
您可以使用
表达式将选择器和值转换为谓词。Equal
:
static IQueryable<TSource> Search<TSource, TValue>(
this IQueryable<TSource> source,
Expression<Func<TSource,TValue>> selector,
TValue value)
{
var predicate = Expression.Lambda<Func<TSource,bool>>(
Expression.Equal(
selector.Body,
Expression.Constant(value, typeof(TValue))
), selector.Parameters);
return source.Where(predicate);
}
如果您想从数据库中执行此操作,那么这取决于数据库是什么;例如,使用LINQ to SQL,您可以添加一个额外的方法:
static IQueryable<TSource> Search<TSource, TValue>(
this System.Data.Linq.DataContext database,
Expression<Func<TSource, TValue>> selector,
TValue value) where TSource : class
{
IQueryable<TSource> source = database.GetTable<TSource>();
return Search(source, selector, value);
}
静态IQueryable搜索(
此System.Data.Linq.DataContext数据库,
表达式选择器,
TValue(值),其中TSource:class
{
IQueryable source=database.GetTable();
返回搜索(源、选择器、值);
}
和使用:
var result = database.Search<SomeEntity, string>(x => x.SomeProp, "value");
var result=database.Search(x=>x.SomeProp,“value”);
坦白地说,我认为使用
数据库更为清晰。但是,有些实体
版本。您想创建一个与搜索()方法类似的通用方法吗?这是他想要的一部分,他确实想指定类型,我真的不清楚这是否/如何回答这个问题,如果第二个参数总是bool,那么你可以像这样使用它:var result2=Search(x=>x.Name==“the Name”);在这种情况下,OP为什么需要提取成员名称?在我看来,他们只需要建造predicate@Marc:这不是问题的一部分,但我假设OP在搜索方法中需要知道这一点,例如构建SQL查询。
var name = expression.MemberName();
static IQueryable<TSource> Search<TSource, TValue>(
this IQueryable<TSource> source,
Expression<Func<TSource,TValue>> selector,
TValue value)
{
var predicate = Expression.Lambda<Func<TSource,bool>>(
Expression.Equal(
selector.Body,
Expression.Constant(value, typeof(TValue))
), selector.Parameters);
return source.Where(predicate);
}
var result = database.SomeEntities.Search(x => x.SomeProp, "value");
static IQueryable<TSource> Search<TSource, TValue>(
this System.Data.Linq.DataContext database,
Expression<Func<TSource, TValue>> selector,
TValue value) where TSource : class
{
IQueryable<TSource> source = database.GetTable<TSource>();
return Search(source, selector, value);
}
var result = database.Search<SomeEntity, string>(x => x.SomeProp, "value");