2

我正在尝试通过其 ID 检索单个实体DomainService

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

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 查询?

4

3 回答 3

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);
}
于 2012-06-14T14:46:53.427 回答
1

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

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

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

只需将您的 FirstOrDefault() 应用于客户端代码(当然,一旦加载数据)。

于 2012-06-11T10:46:56.750 回答
0

启用 RIA 的控件(如 DomainDataSource 和 DataPager)使用 LINQ 'Take()' 来处理它们生成的几乎每个加载操作(检查您的 Fiddler 跟踪以了解我的意思)。我没有看足够长的时间来说它 100% 的时间,但它的大部分时间。这些控件需要一个 IQueryable,否则当您尝试执行排序、分页、分组等操作时,它们会随机弹出。调用 .FirstOrDefault() 真的没什么大不了的。

于 2012-06-18T19:47:13.730 回答