【发布时间】:2014-01-16 18:56:49
【问题描述】:
在 RIA 服务(可能还有其他框架,如 WCF 数据服务)中,可以通过提供返回 IQuerably 的方法来实现数据服务方法。例如:
IQueryable<Customer> GetCustomers()
{
return this.DbContext.Customers.Where(c => !c.IsDeleted);
}
然后,来自客户端的查询可以提供额外的过滤器(除其他外)。客户端提供的过滤器和只返回未删除客户的过滤器都将通过实体框架(或任何使用的 ORM)组合并发送到 SQL 中的数据库。
通常实体框架不足以表达一个想要编写的查询,在这种情况下,我们必须去 linq to objects:
IQueryable<CustomerWithFluff> GetCustomers()
{
var customers =
this.DbContext.Customers
.Include("FluffBits")
.Where(c => !c.IsDeleted)
.ToList();
return
from c in customers
select new CustomerWithFluff()
{
CustomerName = c.Name,
ComplexFluff = String.Join(", ", from b in c.FluffBits select b.FluffText)
};
}
到数据库的 sql 现在仍将包含对“IsDeleted”的限制,但不再包含客户端提供的任何进一步的过滤器:在获取所有数据后,这些过滤器将应用于 linq to objects 级别。
如果我不想让客户端过滤我需要与 linq-to-objects 组合的任何数据(本例中只有“ComplexFluff”),有没有办法仍然允许过滤简单投影的属性(本例中只有“CustomerName”)?
【问题讨论】:
-
你最后一段,包含实际问题,不清楚。我建议改写它或举例说明你想做什么......
标签: linq wcf entity-framework linq-to-entities wcf-ria-services