尝试将两个表达式与 组合时出现错误AndAlso。
步骤 1:使用表达式树构建 EF 对象的表达式:
public override Expression<Func<T, bool>> ToExpression()
{
var expressionParameter = Expression.Parameter(typeof(T), "p");
var expressionField = Expression.PropertyOrField(expressionParameter, field);
var expressionConstraint = Expression.Constant(value);
BinaryExpression expression = Expression.Equal(expressionField, expressionConstraint);
return Expression.Lambda<Func<T, bool>>(expression, expressionParameter);
}
Run Code Online (Sandbox Code Playgroud)
如果我.ToExpression();为一个表达式调用并运行此代码,则此代码可以与 EF 正常配合,它会生成表达式:
{ p => (p.MyField1 == "X") }
Run Code Online (Sandbox Code Playgroud)
但是当我尝试做的时候
步骤 2:将两个表达式组合为AndAlso:
public override Expression<Func<T, bool>> ToExpression()
{
Expression<Func<T, bool>> leftExpression = left.ToExpression();
Expression<Func<T, bool>> rightExpression = right.ToExpression();
BinaryExpression andExpression = Expression.AndAlso(leftExpression.Body, rightExpression.Body);
return Expression.Lambda<Func<T, …Run Code Online (Sandbox Code Playgroud) 受这个答案的启发我试图将模型类的属性映射到基于实际实体的表达式.这是涉及的两个类:
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Id { get; set; }
public DateTime? BirthDate { get; set; }
public int CustomerTypeId { get; set; }
}
public class CustomerModel
{
...
public bool HasEvenId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想要转换的可能表达式的示例是:
Expression<Func<CustomerModel, bool>> from = model => model.HasEvenId;
Expression<Func<Customer, bool>> to = entity => ((entity.Id % 2) == 0);
Run Code Online (Sandbox Code Playgroud)
问题是我必须通过ASP.NET WebAPI公开OData端点,但是我需要先对实体进行一些操作,因此需要一个模型类,需要根据模型转换表达式我可以在基于实体的表达式中接收OData查询,我将用它来查询EF4.
这是我到目前为止的地方:
private static …Run Code Online (Sandbox Code Playgroud) 使用 Entity Framework Core 进行查询时,我使用表达式转换为 DTO 对象,这对于对象和任何子集合都很有效。
一个简化的例子:
模型:
public class Model
{
public int ModelId { get; set; }
public string ModelName { get; set; }
public virtual ICollection<ChildModel> ChildModels { get; set; }
// Other properties, collections, etc.
public static Expression<Func<Model, ModelDto>> AsDto =>
model => new ModelDto
{
ModelId = model.ModelId,
ModelName = model.ModelName,
ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList()
};
}
Run Code Online (Sandbox Code Playgroud)
询问:
dbContext.Models.Where(m => SomeCriteria).Select(Model.AsDto).ToList();
Run Code Online (Sandbox Code Playgroud)
我的问题是试图找到一种方法为非集合的孩子做类似的事情。如果我已添加到我的模型中:
public AnotherChildModel AnotherChildModel { get; set; }
Run Code Online (Sandbox Code Playgroud)
我可以在表达式中添加转换:
public static Expression<Func<Model, ModelDto>> AsDto …Run Code Online (Sandbox Code Playgroud)