我试图自己解决,但是......看起来我需要人的帮助。我有带有 WCF RIA 和 EntityFramework 的 Business Silverlight 应用程序。我通过 LinqToEntites 访问数据库。
我由此制作的数据库中的常见加载数据:
return DbContext.Customers
此代码从数据库返回完整的客户表。但有时我不需要显示所有数据。简单的方法是通过下一个代码在客户端使用 linq 过滤器:
public LoadInfo()
{
...
var LO1 = PublicDomainContext.Load(PublicDomainContext.GetCustomersQuery());
LO1.Completed += LO1Completed;
...
}
private void LO1Completed(object sender, EventArgs eventArgs)
{
...
DatatViewGrid.ItemsSource = null;
DatatViewGrid.ItemsSource = loadOperation.Entities.Where(c=>c ...filtering...);
//or PublicDomainContext.Customers.Where(c=>c ...filtering...)
...
}
但是这种方式有一个非常非常重要的缺陷:所有通过 DomainService 从服务器传递到客户端的数据都可能被Fiddler等应用程序查看。所以我需要想出另一种方法。
任务:在服务器端过滤接收数据并返回此数据。
方式#1: LinqToEntites 有一个漂亮的投影方法:
//MSDN Example
var query =
contacts.SelectMany(
contact => orders.Where(order =>
(contact.ContactID == order.Contact.ContactID)
&& order.TotalDue < totalDue)
.Select(order => new
{
ContactID = contact.ContactID,
LastName = contact.LastName,
FirstName = contact.FirstName,
OrderID = order.SalesOrderID,
Total = order.TotalDue
}));
但是,不幸的是,DomainServices 不能返回未定义的类型,所以这种方式行不通。
方式 #2:我找到了下一个解决方案 - 制作单独的 DTO 类(DataTransferObject)。我刚刚阅读了一些示例,并在下一节课在服务器端制作:
[DataContract]
public partial class CustomerDTO
{
[DataMember]
public int ISN { get; set; }
[DataMember]
public string FIO { get; set; }
[DataMember]
public string Listeners { get; set; }
}
基于这个类,我做了一行返回过滤数据的方法:
[OperationContract]
public List<CustomerDTO> Customers_Common()
{
return DbContext.Customers....Select(c => new CustomerDTO { ISN = c.ISN, FIO = c.FIO, Listeners = c.Listeners }).ToList();
}
这很好用,一切都很好......
但是,有一个奇怪的问题:在本地运行应用程序并不影响任何麻烦,但是在网站上发布项目后,DomainService 每个方法都返回 HTTP 500 错误(“未找到”异常)。当然,我什至不能登录到我的应用程序。域服务已死。如果我从应用程序中删除最后一个类和新方法并重新发布 - 一切正常,但没有特殊过滤......
问题:我做错了什么,为什么服务因新课程而死,或者告诉我另一种解决问题的方法。请。
更新 :
嘿,我终于解决了这个问题!有一个答案:使用 WCF RIA 服务进行动态查询