我试图自己解决,但......看起来我需要人们的帮助。 我有WCF RIA和EntityFramework的Business Silverlight应用程序。访问数据库我通过LinqToEntites获得。
我做的数据库的常见加载数据:
return DbContext.Customers
此代码从DataBase返回完整的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有一个漂亮的投影方法:</ p>
//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错误(“未找到”异常) 。当然,我甚至无法登录到我的应用程序中。 DomainService已经死了。如果我从应用程序中删除最后一个类和新方法并重新发布 - 一切正常,但没有特殊过滤......
问题:我做错了什么,为什么服务因新课程而死,或者告诉我另一种解决问题的方法。请。
答案 0 :(得分:1)
最好的方法是找出导致错误的原因。为此,重写DomainService上的OnError方法,如下所示:
protected override void OnError(DomainServiceErrorInfo errorInfo)
{
/* Log the error info to a file. Don't forget inner exceptions.
*/
base.OnError(errorInfo);
}
这很有用,因为只有两个异常会传递给客户端,所以如果有很多嵌套的内部异常,你仍然应该能够看到实际导致错误的原因。
此外,您可以通过将调试器附加到要打开站点的浏览器实例来检查错误。在VS2010中,这可以通过 [Debug] - &gt;来完成。菜单栏中的 [附加到处理] 。