【问题标题】:EF6 Convert IQueryable to DbQueryEF6 将 IQueryable 转换为 DbQuery
【发布时间】:2015-05-21 10:06:13
【问题描述】:

在实体框架 6 中,当运行使用 lambda 表达式到上下文的 Include 方法的重载时:

Context.SomeEntity.Include(x => x.MyOtherEntity))

它返回一个 IQueryable,而当我们使用使用字符串时:

Context.SomeEntity.Include("MyOtherEntity")

它返回一个 DbQuery。

我需要返回一个 DbQuery 并且不想使用字符串重载,以便在编译时出现包含错误。

在使用包含 lambda 后如何返回 DbQuery?

【问题讨论】:

  • 为什么需要 DbQuery?那你为什么不使用其他重载呢。您可以使用自定义方法传入您的表达式 (x => x.MyOtherEntity) 并手动为其构建字符串。 SO上有很多可以找到的

标签: entity-framework iqueryable


【解决方案1】:

我相信您无法将 IQueryable 转换为 DbQuery。但是,您可以使用此代码传入表达式并获取所需的字符串。

请务必为此编写一些单元测试并根据您的需要调整方法。我还没有正确测试它。

public static string GetMemberName<T>(this Expression<Func<T>> expression)
    {
        MemberExpression memberExp;
        if (!TryFindMemberExpression(expression.Body, out memberExp))
            return string.Empty;

        var memberNames = new Stack<string>();
        do
        {
            memberNames.Push(memberExp.Member.Name);
        }
        while (TryFindMemberExpression(memberExp.Expression, out memberExp));

        return string.Join(".", memberNames.ToArray());
    }


private static bool TryFindMemberExpression(Expression exp, out MemberExpression memberExp)
    {
        memberExp = exp as MemberExpression;
        if (memberExp != null)
        {
            return true;
        }

        if (IsConversion(exp) && exp is UnaryExpression)
        {
            memberExp = ((UnaryExpression)exp).Operand as MemberExpression;
            if (memberExp != null)
            {
                return true;
            }
        }

        return false;
    }

    private static bool IsConversion(Expression exp)
    {
        return (exp.NodeType == ExpressionType.Convert || exp.NodeType == ExpressionType.ConvertChecked);
    }

【讨论】:

    猜你喜欢
    • 2012-02-07
    • 2015-03-12
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多