当我尝试使用实体 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=>x.RegionTypeId).ToArray())
正确: regionTypeId.Any(item => sites.Regions.Select(x => 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 获取行时出现错误的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试使用 symfony 创建实体时出现 Aborted 错误消息 [重复]
在 powershell 中运行时出现 Git-Tfs 错误。 “检索 LoaderExceptions”