Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将LINQ In子句转换为EF_C#_Entity Framework_Linq - Fatal编程技术网

C# 无法将LINQ In子句转换为EF

C# 无法将LINQ In子句转换为EF,c#,entity-framework,linq,C#,Entity Framework,Linq,我需要使用EF实体将此简单SQL查询转换为LINQ: 选择*从ID_Cliente插入的客户选择ID_Objeto FROM 其中ID_TipoDireccion=IDTipoDireccion的目录 看起来很简单,但这似乎是一个很难实现的目标。我试试这个: public List<Clientes> EnumEntity(int IDTipoDireccion) { var dir = new DireccionesRepository(ref rep.Context);

我需要使用EF实体将此简单SQL查询转换为LINQ:

选择*从ID_Cliente插入的客户选择ID_Objeto FROM 其中ID_TipoDireccion=IDTipoDireccion的目录

看起来很简单,但这似乎是一个很难实现的目标。我试试这个:

public List<Clientes> EnumEntity(int IDTipoDireccion)
{
    var dir = new DireccionesRepository(ref rep.Context);
    var misClientes = rep.ListEntity();

    var misDirColection = dir.ListEntity().ToList().Where(o => o.ID_TipoDireccion == IDTipoDireccion);

    foreach (var item in misDirColection)
    {        
        misClientes=misClientes.Where(p => p.ID_Cliente == item.ID_Objeto);
    }
    return misClientes.ToList();
}
上述查询的问题在于使用和。我需要它来使用或包含与Direcciones对象匹配的所有客户端。 我尝试使用PredicateBuilder类,但它不支持EF。我发现这似乎解决了这个问题:

internal class SubstExpressionVisitor : System.Linq.Expressions.ExpressionVisitor
{
    public Dictionary<Expression, Expression> subst = new Dictionary<Expression, Expression>();

    protected override Expression VisitParameter(ParameterExpression node)
    {
        Expression newValue;
        if (subst.TryGetValue(node, out newValue))
        {
            return newValue;
        }
        return node;
    }
}

public static class PredicateBuilder
{
    /*public static Expression<Func<T,bool>> True<T>() { return f => true; }*/
    //public static Expression<Func<T, bool>> False<T>() { return f => false; }       

    public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> a, Expression<Func<T, bool>> b)
    {
        ParameterExpression p = a.Parameters[0];

        SubstExpressionVisitor visitor = new SubstExpressionVisitor();
        visitor.subst[b.Parameters[0]] = p;
        Expression body = Expression.AndAlso(a.Body, visitor.Visit(b.Body));
        return Expression.Lambda<Func<T, bool>>(body, p);            
    }

    public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> a, Expression<Func<T, bool>> b)
    {
        ParameterExpression p = a.Parameters[0];

        SubstExpressionVisitor visitor = new SubstExpressionVisitor();
        visitor.subst[b.Parameters[0]] = p;
        Expression body = Expression.OrElse(a.Body, visitor.Visit(b.Body));
        return Expression.Lambda<Func<T, bool>>(body, p);
    }

}
但问题是我不知道如何在我的案例中使用它。 有人能帮我吗

谢谢

编辑

在修改建议的代码后,如果其他人需要它,这就是结果:

public List<EnumeradorWCFModel> EnumEntity(int IDTipoDireccion)
    {
        // SELECT * FROM Clientes WHERE ID_Cliente IN(SELECT ID_Objeto FROM Direcciones where ID_TipoDireccion=IDTipoDireccion)
        // Get All directions of type IDTipoDireccion
        var dir = new DireccionesRepository(ref rep.Context);

        var misDirColection = dir.ListEntity().Where(x => x.ID_TipoDireccion == IDTipoDireccion)
                .Select(x => x.ID_Objeto);  // Do not iterate!

        // Itinerate Clients
        var misClientes = rep.ListEntity().Where(x => misDirColection.Contains(x.ID_Cliente)).ToList();                

        return misClientes.ToList();
}
使用包含

可直接翻译为:

int IDTipoDireccion = ...

// First, create a query for your subselect.
var direcciones = dbContext.Direcciones
    .Where(x => x.ID_TipoDireccion == IDTipoDireccion);
    .Select(x => x.ID_Objeto);  // Do not iterate!

// Then, use the first query in the WHERE of your second query.
var results = dbContext.Clientes
    .Where(x => direcciones.Contains(x.ID_Cliente))
    .ToList();

乌夫。我脱下帽子。我修改了你的代码,它工作得非常完美。你是个和蔼可亲的人!我发布结果代码。谢谢可能重复的
int IDTipoDireccion = ...

// First, create a query for your subselect.
var direcciones = dbContext.Direcciones
    .Where(x => x.ID_TipoDireccion == IDTipoDireccion);
    .Select(x => x.ID_Objeto);  // Do not iterate!

// Then, use the first query in the WHERE of your second query.
var results = dbContext.Clientes
    .Where(x => direcciones.Contains(x.ID_Cliente))
    .ToList();