无法检索单个实体

时间:2012-06-10 06:25:35

标签: asp.net silverlight wcf-ria-services domainservices

我正在尝试通过DomainService中的ID检索单个实体。

但是,客户端中不会生成该实体的类型。 这是我的疑问:

public Contact GetContact(int contactId)
{
  return DbContext.Contacts
    .Include(c => c.Phones)
    .Include(c => c.Addresses)
    .SingleOrDefault(c => c.ContactId == contactId);
}

客户端上未生成Phone实体。

我尝试用[Query]修饰此方法,但后来我得到以下编译时异常:

  

查询操作'GetContact'无法标记为可组合,因为它的返回类型'Models.Contact'不实现T的IEnumerable。

有没有办法创建一个按ID返回单个实体的WCF RIA查询?

3 个答案:

答案 0 :(得分:3)

设置IsComposable属性将允许它构建。但在我们的讨论中,我不知道为什么您的PhoneAddress实体没有生成。

[Query(IsComposable=false)]
public Contact GetContact(int contactId)
{
  return DbContext.Contacts
    .Include(c => c.Phones)
    .Include(c => c.Addresses)
    .SingleOrDefault(c => c.ContactId == contactId);
}

答案 1 :(得分:1)

RIA服务方法需要IQueryable<T>IEnumerable<T>才能运作。它适用于变更集,而不是单个元素。

将其更改为此(并停止尝试返回单个对象):

public IQueryable<Contact> GetContact(int contactId)
{
  return DbContext.Contacts
    .Include(c => c.Phones)
    .Include(c => c.Addresses)
    .Where(c => c.ContactId == contactId);
}

只需将FirstOrDefault()应用于客户端代码(当然加载数据后)。

答案 2 :(得分:0)

支持RIA的控件如DomainDataSource和DataPager使用LINQ&#39; Take()&#39;他们生成的几乎每一个加载操作(检查你的Fiddler跟踪,看看我的意思)。我没有足够长的时间观看100%的时间,但大部分时间都没有。这些控件期望IQueryable,并且当你尝试执行排序,分页,分组等操作时,它会随机地进行barf。调用.FirstOrDefault()并不是什么大不了的事。