我正在尝试通过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查询?
答案 0 :(得分:3)
设置IsComposable
属性将允许它构建。但在我们的讨论中,我不知道为什么您的Phone
和Address
实体没有生成。
[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()并不是什么大不了的事。