相关疑难解决方法(0)

C# 表达式树 AndAlso 用于实体框架查询

尝试将两个表达式与 组合时出现错误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)

c# expression-trees entity-framework-core

6
推荐指数
1
解决办法
199
查看次数

将表达式树从类型转换为具有复杂映射的另一种类型

这个答案的启发我试图将模型类的属性映射到基于实际实体的表达式.这是涉及的两个类:

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)

linq entity-framework expression-trees asp.net-web-api

5
推荐指数
1
解决办法
2417
查看次数

我可以重用代码来使用 EF Core 为子属性选择自定义 DTO 对象吗?

使用 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)

c# entity-framework expression-trees entity-framework-core

4
推荐指数
1
解决办法
1978
查看次数