2011-12-15 50 views
0

我有一个ServiceOperation在一定的时间来查询提供给特定用户的项目。 总之这梅索德作用:是否有可能操纵在ServiceOperation一些实体返回一个IQueryable

var fullResult = from i in Items where ... select i; //get ALL possible items where..., 

比方说这个返回项{A,B,C,d}。 第二个查询过滤出主叫用户有权访问哪些项目。

var clientResult = from ci in fullResult where (privilege's and schedule's are true) 

这个螨结果{A,C}并被返回。 客户端的结果是:仅显示客户端可以访问的项目列表。这可能很烦人,因为您不知道您是否在搜索时犯了错误,或者该项目现在不可用。

我想做什么就能做的是显示所有可能的结果到客户端{A,B,C,d}但FLAG B和d在这种情况下不可用。

我的实体已经有一个属性isReadOnly我可以使用。

我可以写一个查询,不只是过滤掉,也标志为只读任何剩余的结果吗?理想的结果是{A,B.isREadOnly = true,C,D.isReadOnly = true}

或者我是否达到了可行的限制,是否必须编写传统的WCF Web方法,单独的课程,返回结果列表?

PS:这个“isReadOnly”属性只用于此,我不介意它在DB正在改变所有

thanx的任何指针

安德烈亚斯

回答

1

如果我是你会考虑不直接将实体返回给你的服务,而是将它映射到具有ReadOnly属性的东西。例如,如果你的实体是:

public class A 
{ 
    public string Name { get; set; } 
} 

然后,你可以有这样的数据合同:

[DataContract] 
public class AExtra 
{ 
    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public bool IsReadOnly { get; set; } 
} 

这是什么意思是,你可以在你的查询做到这一点:

var res = from a 
      in Items 
      where (...whatever your original logic is) 
      select new AExtra 
      { 
       Name = a.Name, 
       IsReadOnly = (...put your logic for determining ReadOnly in here) 
      }; 

然后从服务操作中返回资源。

只是一个意见真的,但我喜欢做这样的事情,而不是直接发送实体出服务的 - 它总是给我一点更自由改变的事情,而不必过多的连锁效应。

+0

确定,在这种情况下,我有一个后续问:我需要在我除了DB在我的模型(即实体A(DB)映射实体创建一个扩展实体,AExtra(MyOwnEntity)。我的理解向前这样,映射查询到一个新的类型的方法,但如何处理保存更改? 我想我必须做的更改拦截一些魔术,但究竟是什么我会做更改保存回到? – Andreas 2011-12-16 16:09:38

相关问题