Entity framework EF6将IQueryable转换为DbQuery
在Entity framework 6中,在对上下文运行使用lambda表达式的Include方法重载时: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一起
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)并手动为其构建字符串。有很多这样的人可以找到