这听起来很简单(也许我错过了这里显而易见的)但我找不到解决方案.我知道我可以查询实体并返回一个或多个直接子实体执行此操作:
var query = from c in Service.Clients.Expand("Addresses,Comments,PhoneNumbers")..
Run Code Online (Sandbox Code Playgroud)
我想能做的是做3个等级(孩子的孩子),让我们说"国家 - >省 - >城市"或"品牌 - >家庭 - >模型"
我试图扩展所有实体,但它失败了
var query = from c in Service.Brands.Expand("Families,Models").. //fails,
//which even makes some sense, since Models is a Child of Family, not Brand
var query = from c in Service.Brands.Expand("Families").. //this works,
//but Family.Models is empty
Run Code Online (Sandbox Code Playgroud)
有没有办法在一个查询中执行此操作,还是必须在两个单独的查询中拆分它?
我尝试使用System.Linq.Expressions.Expression(WPF / c#4.0)创建一个动态查询工具,该工具针对OData服务运行。
到目前为止,只要我限制建立条件的条件(如Equal(..),GreaterThan(..)等),一切就可以正常工作。contains/ Like条件似乎没有任何构建,因此我尝试构建自己的条件。已经有一些文章了。我尝试过的一个方法是如何为Like创建System.Linq.Expressions.Expression?。
现在,如果我使用上述解决方案,则结果为
whereCallExpression = {Convert([10000]).Expand("A,B").Where(clt => MyLike(clt.LastName, "te"))}'
Run Code Online (Sandbox Code Playgroud)
很好,但是错误,因为它不会转换为有效的Odata查询。
如果我使用条件“等于”,则结果为
whereCallExpression = {Convert([10000]).Expand("A,B").Where(clt => (clt.LastName == "te"))}
Run Code Online (Sandbox Code Playgroud)
这导致OData查询
results = {http://.../Clients()?$filter=LastName eq 'te'&$expand=A,B}
Run Code Online (Sandbox Code Playgroud)
并按预期工作。
我在解决方案的实现方面做错了,还是不能与OData一起使用?
它应该转移到类似 ...?$filter=substringof('te', LastName ) eq true
关于如何解决此问题的任何解决方案?
问候
安德烈亚斯
PS,我在静态类中实现了解决方案扩展,我所更改的只是被调用方法的名称,从“ Like”更改为“ MyLike”。此外,由于用于构建表达式的代码可与任何内置条件一起使用,我认为,现在这部分还可以。如果需要,我可以将其中的一部分张贴
我有以下测试设置,所有工作:
-WCF应用程序运行MathService.svc,设置为使用SimpleMembershipProvider
-MVC 4 Internet App使用默认的SimpleMembershipProvider
- 会员资格是:
- 证书,据我所知,我可以使用wshttp连接到服务
服务方法代码.
//[PrincipalPermission(SecurityAction.Demand, Role = "Debug")]
public string Add(double A, double B)
{
OperationContext oc = OperationContext.Current;
ServiceSecurityContext ssc = oc.ServiceSecurityContext;
string cltName = ssc.PrimaryIdentity.Name; //cltName = "Debug"
var Rs = Roles.GetAllRoles(); //returns: 'Debug', 'Administrator', 'Editor' => OK
var dUsers = Roles.GetUsersInRole("Debug"); // 'Debug' => Expected
var aUsers = Roles.GetUsersInRole("Administrator"); // 'Debug', 'Admin' => expected
try
{
var a = Roles.GetRolesForUser(cltName); //this fails
var b = Roles.IsUserInRole(cltName, "Debug"); …Run Code Online (Sandbox Code Playgroud)