我试图首先从基于租户的特定表中搜索域ID,然后对于域ID,我在另一个表中查找域名并添加列表。我在列表中添加域对象时收到错误。我的代码如下所示:
public IEnumerable<Domain> GetAllByTenant(Guid tenantId)
{
List<Domain> domains = null;
var ids = _applicationDbContext.TenantDomainMap.Where(x => x.TenantId == tenantId).Select(x => x.DomainId);
foreach (var id in ids)
{
var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id);
domains.Add(domain);
}
return domains;
}
我在domains.Add(域名)上遇到以下错误: 1.最佳重载方法匹配&#39; System.Collections.Generic.List.Add(XXX.Models.Domain)&#39;有一些无效的论点 2.无法转换为System.Linq.IQueryable&#39;到&#39; XXX.Models.Domain&#39;
请帮我解决这个问题。
答案 0 :(得分:2)
Where
方法始终返回IQueryable
,因为它无法知道与谓词匹配的项目数。
在Where
调用后,您可以添加4种可能的方法来解决此问题。
<强>单强>: 此方法只需要一次匹配,如果找到多个匹配项或未找到匹配项,则会抛出异常。
var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id).Single();
<强>的SingleOrDefault 强>:
此方法与Single
相同,只是它会返回默认值(T)的结果,其中T是您的类型,当没有找到结果时;这通常是空的。
var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id).SingleOrDefault();
<强>第一强>: 此方法将返回列表中的第一项,如果未找到匹配项,则仅抛出异常。
var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id).First();
<强> FirstOrDefault 强>:
与First
不同的方法不会在没有匹配的情况下抛出异常,而是像SingleOrDefault
一样工作,并返回类型的默认值。
var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id).FirstOrDefault();
鉴于您正在对ID进行搜索,Single
可能是正确的选择,但可能需要SingleOrDefault
取决于您的保存逻辑。
答案 1 :(得分:1)
尝试添加.FirstOrDefault();
以确保仅返回从Where
返回的第一个匹配项。
foreach (var id in ids)
{
var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id).FirstOrDefault();
domains.Add(domain);
}
Where
会返回IEnumerable
类型,您需要在列表中为每个类型添加一个Domain
类型。