[英]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.