在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?
答案 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