繁体   English   中英

Linq Expression EF核心

[英]Linq Expression EF core

我正在尝试使用表达式树查询数据库。 我没有运气。 我正在使用EF Core。

我正进入(状态

Expression of type 'System.String' 
cannot be used for parameter of type 'System.Linq.IQueryable`1[TestExpression.Model.Status]' 
of method 'Boolean Contains[Status](System.Linq.IQueryable`1[TestExpression.Model.Status], TestExpression.Model.Status)

    public static void SearchByColumn(string term)
    {
        TestModel testModel = new TestModel();
        IQueryable<Status> sourceQueryable = testModel.Status;

        IQueryable<string> selectQueryable = sourceQueryable.Select(product => product.Name);
        IQueryProvider selectQueryProvider = selectQueryable.Provider; // DbQueryProvider.

        ConstantExpression constantExpression = MethodCallExpression.Constant(term);

        Func<IQueryable<Status>, Status, bool> contains = Queryable.Contains;
        ParameterExpression statusParameterExpression = Expression.Parameter(typeof(Status), "status");

        MethodCallExpression methodCallExpression = Expression.Call(
            method: contains.Method,
            arg0: Expression.Property(statusParameterExpression, nameof(Status.Name)), 
            arg1: constantExpression);

        var someval = selectQueryProvider.Execute<Status>(methodCallExpression); // Execute query.
    }

这里有很多错误,很难确切知道您要查询的内容。 您似乎想要以下内容:

from testModel.Status s
where s.name.Contains(term)
select s

之所以会出现异常,是因为您尝试使用Queryable.Contains而不是string.Contains

这是您可能的处理方式(已通过LINQPad测试)

void Main() {
    // test setup
    var term = "test";

    var source = new [] {
        new Status { Name = "some test" },
        new Status { Name = "test other" },
        new Status { Name = "other" }
    }.AsQueryable();

    // build expression 
    // s => s.Name.Contains("{term}")
    var paramExpr    = Expression.Parameter(typeof(Status), "s");
    var nameExpr     = Expression.Property(paramExpr, nameof(Status.Name));
    var termExpr     = Expression.Constant(term);
    var containsExpr = Expression.Call(nameExpr, nameof(string.Contains), new Type[] { }, termExpr);
    var lambda       = Expression.Lambda<Func<Status, bool>>(containsExpr, paramExpr);

    source.Where(lambda).Dump(); 
}

public class Status {
    public string Name { get; set; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM