当我尝试使用实体 EF6 获取行时出现错误

Posted

技术标签:

【中文标题】当我尝试使用实体 EF6 获取行时出现错误【英文标题】:Getting error when I try to fetch rows using entity EF6 【发布时间】:2017-03-10 02:42:52 【问题描述】:

我首先使用 linq to entity 6 代码。

这是两个实体类:

    public class Site 
    
        public int Id  get; set; 
        public int UID  get; set; 
        public string Name  get; set; 
        public string Description  get; set; 
        public int? ContractId  get; set; 
        public int? SiteTypeId  get; set; 

        public virtual ICollection<SiteRegion> Regions  get; set; 
    


    public class SiteRegion 
    
        public int Id  get; set; 
        public int UID  get; set; 
        public int? SiteId  get; set; 
        public string Name  get; set; 
        public int? RegionTypeId  get; set; 

        [ForeignKey("SiteId")]
        public virtual Site Site  get; set; 

    

正如您在上面看到的 Regions 字段是约束,我与表之间存在一对多的关系。

我创建了这个 LINQ 查询来从 Sites 表中获取所需的行:

int?[] ContractId = [1,2];
int?[] siteTypeId = [1,2,3]; 

 var result = (from sites in context.Set<Site>()
               where contractsIDList.Contains(sites.ContractId) && 
               siteTypeId.Contains(sites.SiteTypeId) &&
               select sites).AsNoTracking<Site>();

而且效果很好。

现在我有新要求,我还需要通过 SiteRegion 表中的RegionTypeId 列过滤我的查询,这是我的新查询:

int?[] ContractId = [1,2];
int?[] siteTypeId = [1,2,3]; 
int?[] regionTypeId = [1,2,3];

 var result = (from sites in context.Set<Site>()
               where contractsIDList.Contains(sites.ContractId) && 
               siteTypeId.Contains(sites.SiteTypeId) &&
    regionTypeId.Contains(sites.Regions.SelectMany(x=>x.RegionTypeId).ToArray())

               select sites).AsNoTracking<Site>();

但我得到错误:

Error   36  'int?[]' does not contain a definition for 'Contains' and the best extension method overload 'System.Linq.Queryable.Contains<TSource>(System.Linq.IQueryable<TSource>, TSource)' has some invalid arguments 

在这一行:

regionTypeId.Contains(sites.Regions.SelectMany(x=>x.RegionTypeId).ToArray())

如何修复上面的查询以获得所需的行?

【问题讨论】:

Contains 是一种扩展方法,它采用单个值,而不是数组。你可能可以制作一个join 【参考方案1】:

您需要按照如下所示进行操作。

注意:

错误regionTypeId.Contains(sites.Regions.SelectMany(x=&gt;x.RegionTypeId).ToArray())

正确: regionTypeId.Any(item =&gt; sites.Regions.Select(x =&gt; x.RegionTypeId).Contains(item))

工作示例:

 int?[] contractsIDList =  1, 2;
 int?[] siteTypeId =  1, 2, 3;
 int?[] regionTypeId =  1, 2, 3;

var result = (from sites in db.Set<Site>()
              where contractsIDList.Contains(sites.ContractId) && siteTypeId.Contains(sites.SiteTypeId)
              && regionTypeId.Any(item => sites.Regions.Select(x => x.RegionTypeId).Contains(item))
              select sites).AsNoTracking<Site>();

结果:

【讨论】:

以上是关于当我尝试使用实体 EF6 获取行时出现错误的主要内容,如果未能解决你的问题,请参考以下文章

sudo命令:解决使用Linux命令行时出现的错误提示

EF6 无法将分离的实体附加到上下文

当我尝试使用 symfony 创建实体时出现 Aborted 错误消息 [重复]

在 powershell 中运行时出现 Git-Tfs 错误。 “检索 LoaderExceptions”

核心数据 - 在不触发错误的情况下获取对多关系的 objectID

Visual Studio 2013 中带有 EF6 的 MySQL 连接器