最佳重载方法匹配&#39; System.Collections.Generic.List <xxx.models.domain> .Add(XXX.Models.Domain)&#39;有一些无效的参数

时间:2016-03-21 15:52:14

标签: .net entity-framework linq

我试图首先从基于租户的特定表中搜索域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;

请帮我解决这个问题。

2 个答案:

答案 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类型。