EF6将IQueryable转换为DbQuery

时间:2015-05-21 10:06:13

标签: entity-framework iqueryable

在Entity框架6中,当运行将lambda表达式用于上下文的Include方法的重载时:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> <soapenv:Body> <ns2:uploadApp xmlns:ns2="http://upload.application.carbon.wso2.org"> <ns2:fileItems> <ns1:dataHandler xmlns:ns1="http://upload.application.carbon.wso2.org/xsd"> <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:1.4aefed8d8cef221bc29fec3e7341b21813a53a5181b39c2b@apache.org" /> </ns1:dataHandler> <ns1:fileName xmlns:ns1="http://upload.application.carbon.wso2.org/xsd">ESBproject1-1.0.0.car</ns1:fileName> <ns1:fileType xmlns:ns1="http://upload.application.carbon.wso2.org/xsd">jar</ns1:fileType> </ns2:fileItems> </ns2:uploadApp> </soapenv:Body> </soapenv:Envelope>

它返回一个IQueryable,而当我们使用一个使用string的那个:

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

它返回一个DbQuery。

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

如何在使用带lambda的include后返回DbQuery?

1 个答案:

答案 0 :(得分:0)

我认为您无法将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); } 。但是,您可以使用此代码传递表达式并获取所需的字符串。

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

Dim A As Date
Dim b As String
Dim c As Long
A = Date
A = DateSerial(Year(A), Month(A), Day(A))
b = Format(A - 7, "yyyy, mm, dd")
c = b    
With ActiveSheet
    .Range("$A:$S").AutoFilter Field:=9, Criteria:=">" & c
    End With