如何在lambda表达式中的字符串中给属性名称? [英] How to give property name in string in lambda expression?

查看:291
本文介绍了如何在lambda表达式中的字符串中给属性名称?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用ef在.net核心中编写查询.现在的问题是,我在参数中获取了属性名称,我想在该属性上添加条件,即

I want to write a query in .net core using ef. Now the issue is, I am getting the property name in parameter and I want to put condition on that property i.e

  public IQueryable<MyModel> Generate(string property, IQueryable<MyModel> query)
  {
    query = query.Where(a => a.property.ToLower() != null);
  }

MyModel:

public string Property1 { get; set; }
public string Property2 { get; set; }
public string Property3 { get; set; }

方法调用:

var query = Generate(MyModel.Property2, query);

我知道使用反射是可行的,但是会影响性能.那么有没有更好的方法呢?

I know this is possible using reflection but that has some performance impacts. So is there any better approach?

推荐答案

在问题澄清后进行

您可以为IQueryable实现通用的扩展方法,其中该子句是动态构建的:

You could implement a generic extension method for IQueryable where the clause is dynamically built:

public static class QueryExtensions
{
    public static IQueryable<TModel> WhereNotNull<TModel>(this IQueryable<TModel> query, string propertyName)
    {
        var parameter = Expression.Parameter(typeof(TModel), "x");
        var body = Expression.PropertyOrField(parameter, propertyName);
        var comparison = Expression.NotEqual(body, Expression.Constant(null, typeof(object)));
        var lambda = Expression.Lambda<Func<TModel, bool>>(comparison, parameter);
        return query.Where(lambda);
    }
}

这样称呼:

query = query.WhereNotNull(nameof(MyModel.Property1));

query = query.WhereNotNull("Property1");

要求对字符串进行空值或空格检查后,

EDIT after request for null or whitespace check on strings:

在字符串属性上调用string.IsNullOrWhiteSpace()的示例:

Example of calling string.IsNullOrWhiteSpace() on string properties:

public static IQueryable<TModel> WhereNotNull<TModel>(this IQueryable<TModel> query, string propertyName)
{
    var parameter = Expression.Parameter(typeof(TModel), "x");
    var body = Expression.PropertyOrField(parameter, propertyName);
    Expression<Func<TModel, bool>> lambda = null;
    if (body.Type == typeof(string))
    {
        var methodCall = Expression.Call(typeof(string), nameof(string.IsNullOrWhiteSpace), null, body);
        var nullOrWhiteSpaceComparison = Expression.Not(methodCall);
        lambda = Expression.Lambda<Func<TModel, bool>>(nullOrWhiteSpaceComparison, parameter);
    }
    else
    {
        var nullComparison = Expression.NotEqual(body, Expression.Constant(null, typeof(object)));
        lambda = Expression.Lambda<Func<TModel, bool>>(nullComparison, parameter);
    }
    return query.Where(lambda);
    }

如果(在其他上下文中)要组合多个表达式,则可以使用Expression.And(Expression left, Expression right)Expression.Or(Expression left, Expression right).左右传递一元/二进制表达式作为参数.

If you (in some other context) want to combine multiple expressions you may use Expression.And(Expression left, Expression right) or Expression.Or(Expression left, Expression right). Pass the unary/binary expression as parameters left and right.

这篇关于如何在lambda表达式中的字符串中给属性名称?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆