Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何用表达式参数c实现方法#_C#_.net_Linq - Fatal编程技术网

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");