6

我想创建一个这样的方法:

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

我怎样才能实现这个方法?

4

3 回答 3

11

您可以使用以下方法将选择器和值转换为谓词Expression.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);
}

然后,您只需要执行以下操作:

var result = database.SomeEntities.Search(x => x.SomeProp, "value");

如果你想从数据库中做,那取决于数据库什么;例如,使用 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);
}

并使用:

var result = database.Search<SomeEntity, string>(x => x.SomeProp, "value");

坦率地说,我认为使用该database.SomeEntities版本更清晰。

于 2013-05-08T09:19:31.590 回答
1

我只能想到这一点(有 2 个通用参数)

    public static IEnumerable<TModel> Search<TModel, TValue>(
        Expression<Func<TModel, TValue>> expression,
        TValue value
    )
    {
        return new List<TModel>();
    }

用法

var result = Search<EntityType, int>(x => x.Id, 1);
var result2 = Search<EntityType, string>(x => x.Name, "The name");

您可以用 object 替换 TValue 以避免第二个通用参数,但我会坚持这一点。

顺便提一句。与这个小帮手一起使用效果很好

public static class ExpressionHelpers
{
    public static string MemberName<T, V>(this Expression<Func<T, V>> expression)
    {
        var memberExpression = expression.Body as MemberExpression;
        if (memberExpression == null)
            throw new InvalidOperationException("Expression must be a member expression");

        return memberExpression.Member.Name;
    }
}

现在您可以通过调用来获取此示例中的属性名称(Id oder Name)

var name = expression.MemberName();
于 2013-05-08T09:18:02.287 回答
0

你想要动态的类型吗

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;
    }
}
于 2013-05-08T09:08:39.410 回答