Entity framework EF6将IQueryable转换为DbQuery

Entity framework EF6将IQueryable转换为DbQuery,entity-framework,iqueryable,Entity Framework,Iqueryable,在Entity framework 6中,在对上下文运行使用lambda表达式的Include方法重载时: Context.SomeEntity.Include(x=>x.MyOtherEntity)) 它返回一个IQueryable,而当我们使用使用字符串的时: Context.SomeEntity.Include(“MyOtherEntity”) 它返回一个DbQuery 我需要返回一个DbQuery,不想使用字符串重载,这样我就可以在编译时得到包含错误 在将include与lambda一起

在Entity framework 6中,在对上下文运行使用lambda表达式的Include方法重载时:

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

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

Context.SomeEntity.Include(“MyOtherEntity”)

它返回一个DbQuery

我需要返回一个DbQuery,不想使用字符串重载,这样我就可以在编译时得到包含错误


在将include与lambda一起使用后,如何返回DbQuery?

我相信您无法将
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);
    }
公共静态字符串GetMemberName(此表达式)
{
memberExp;
if(!TryFindMemberExpression(expression.Body,out memberExp))
返回字符串。空;
var memberNames=新堆栈();
做
{
memberNames.Push(memberExp.Member.Name);
}
while(TryFindMemberExpression(memberExp.Expression,out memberExp));
返回字符串.Join(“.”,memberNames.ToArray());
}
私有静态bool TryFindMemberExpression(表达式exp,out MemberExpression memberExp)
{
memberExp=exp作为MemberExpression;
if(memberExp!=null)
{
返回true;
}
if(IsConversion(exp)&&exp为一元表达式)
{
memberExp=((UnaryExpression)exp).操作数作为MemberExpression;
if(memberExp!=null)
{
返回true;
}
}
返回false;
}
私有静态bool IsConversion(表达式exp)
{
返回(exp.NodeType==ExpressionType.Convert | | exp.NodeType==ExpressionType.ConvertChecked);
}

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