是否可以在ServiceOperation中操作返回IQueryable的某些实体

时间:2011-12-15 16:24:36

标签: entity-framework wcf-data-services service-operations

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

安德烈亚斯

1 个答案:

答案 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。

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