实体框架:如何选择嵌套实体

本文关键字:实体 选择 嵌套 何选择 框架 | 更新日期: 2023-09-27 18:16:04

我的实体层次结构是客户>地址>联系人。因此,我使用此代码迭代联系人详细信息。

Contacts CurrentContacts = null;
foreach (var existingContacts in existingCustomer.Addresses.Select(a => a.Contacts.Where(cc=> cc.ContactID==5)))
{
    CurrentContacts = existingContacts;
}

但是这行CurrentContacts = existingContacts;抛出错误

不能隐式转换类型"System.Collections.Generic。IEnumerable"EFTest.Contacts"。存在显式转换(您是否缺少演员?)

我的错误是什么?existingContacts为触点相关数据,CurrentContacts为触点类型变量。

请告诉我该怎么做

实体框架:如何选择嵌套实体

我认为你有两个问题,但没有看到Contacts类型是如何定义的,这只是一个猜测。

正如@Taemyr指出的,你需要使用SelectMany而不是Select来平整化集合的集合。

但是除非Contacts是从List<EFTest.Contacts>继承的,否则你仍然无法进行赋值操作,你需要将变量声明更改为:

IEnumerable<Contacts> CurrentContacts = null;

SelectMany代替Select

Select预测每个单独的元素,并且对枚举的其余部分不做任何事情.所以Addresses.Select(a=>a.Contacts.Where(...))Address.Contacts.Where(...)的可枚举数。Ie。你得到一个可枚举对象的可枚举对象。

要获得单个可枚举对象,您需要将该列表扁平化。这就是SelectMany做的。

即使

foreach (var existingContacts in <some enumerable>)
{
    CurrentContacts = existingContacts;
}

看起来很奇怪。除非循环中有其他逻辑,否则你可以用;

代替循环。
CurrentContacts= <some enumerable>.LastOrDefault();

如果你不关心你使用哪个联系人,只要它有ContactID=5;

CurrentContacts= <some enumerable>.FirstOrDefault();