1

我在联系人和列表之间的 EF Code First 中存在多对多关系。ProxyCreation 和 LazyLoading 被禁用以允许实体的序列化。

我有一个查询,旨在返回给定列表中的联系人。

// GET api/Contacts
        [Queryable]
        public IQueryable<Contact> GetContacts(int bulkListId)
        {
            var bulkList = db.BulkLists.Include(c => c.Contacts).Where(c => c.ID == bulkListId).SingleOrDefault();

            if (bulkList == null)
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));

            return bulkList.Contacts.AsQueryable().OrderBy(c => c.ID).Include(c => c.AddressBookType).Include(c => c.BulkLists);
        }

虽然这有效,但它并没有按预期工作。它会生成给定列表中的正确联系人集,但这些联系人仅在其关系的 Lists 属性中填充了该列表。因此,当它被序列化并返回给客户端时,它会隐藏联系人所属的其他列表。

我看不到查询是如何以这种方式过滤它的,以及我如何将其更改为包含完整的列表集。任何建议将不胜感激。

4

1 回答 1

1

你在作弊!:)

通过添加AsQueryable()bulkList.Contacts您,可以继续进行Include而不会使编译器抱怨。但...

根据DbExtensions.Include 上的 MSDN

此扩展方法调用 IQueryable 源对象的 Include(String) 方法(如果存在此类方法) 。如果源 IQueryable 没有匹配方法,则此方法不执行任何操作。

(强调我的)

并且EntityCollection没有Include方法,所以什么也没有发生。

您必须在第一条语句中扩展包含列表,可能像这样:

db.BulkLists
    .Include(c => c.Contacts.Select(c => c.AddressBookType))
    .Include(c => c.Contacts.Select(c => c.BulkLists))
于 2012-08-13T14:13:28.603 回答