0

我有一个 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)

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

我想做的是向客户端 {A, B, C, D} 显示所有可能的结果,但在这种情况下,标志 B 和 D 不可用。

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

我可以编写一个查询来过滤掉,而且还可以将任何剩余的结果标记为只读?理想的结果是 {A, B.isREadOnly=true, C, D.isReadOnly=true}

或者我是否达到了可行的极限,我是否必须编写一个传统的 WCF Web 方法,创建一个单独的类,返回一个结果列表?

PS:这个“isReadOnly”属性只用于这个,我不介意它在数据库中被改变

感谢任何指针

安德烈亚斯

4

1 回答 1

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。

只是一个意见,但我喜欢做这样的事情,而不是直接将实体从服务中发送出去——它总是给我更多的自由来改变事情,而不会产生太多的连锁反应。

于 2011-12-16T07:18:36.737 回答