我有一个ServiceOperation来查询某个特定用户可用的项目。 简而言之,这个方法确实:
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
安德烈亚斯
答案 0 :(得分: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)
};
然后从您的服务操作中返回res。
只是一个意见,但我喜欢做这样的事情,而不是直接将实体发送出服务 - 它总是让我更自由地改变事物而不会产生太多的连锁反应。