C# EF辅助表中的重复值
我正在使用实体框架开发一个web应用程序 我需要为C# EF辅助表中的重复值,c#,entity-framework,asp.net-core,C#,Entity Framework,Asp.net Core,我正在使用实体框架开发一个web应用程序 我需要为Ilist执行选择并传递值,但它返回重复的值 IQueryable<establishmentInfo> filter = (from x in db.establishments join t in db.establishment_categories on x.id equals t.establishment
Ilist
执行选择并传递值,但它返回重复的值
IQueryable<establishmentInfo> filter = (from x in db.establishments
join t in db.establishment_categories on x.id equals t.establishment
join q in db.categories on t.category equals q.id
where (x.name.ToUpper().Contains(search.ToUpper()))
select new establishmentInfo
{
id = x.id,
name = x.name,
id_category = q.id,
category = q.name,
});
IList<establishmentInfo>establishments = filter.ToList();
机构及类别
id establishment category
-------------------------------
1 1 1
2 1 2
3 2 1
类别
id name
---------------------
1 alpha
2 beta
问题是返回2家机构,一家为1类,另一家为2类。我需要取下其中一个
有人能帮忙吗?正如@NetMage所说,您的linq语句应该返回两个不重复的值 我们可以看到,在您的
编制(categories
表中有两条记录的编制
设置为1
。您可以查看您的机构
。id\u类别
应为1
,类别
应为alpha
,id\u类别
应为2
,类别
应为beta
您可以看到下图:
如果您只想获取机构的第一个数据,您可以编写以下代码:
IQueryable<Establishment> filter = (from x in _context.Establishments
join t in _context.Establishment_Categories on x.Id equals t.EstablishmentId
join q in _context.Categories on t.CategoryId equals q.Id
where x.Name.ToUpper().Contains(search.ToUpper())
select new Establishment
{
Id = x.Id,
Name = x.Name,
CategoryId = q.Id,
CategoryName = q.Name,
}).Take(1);
List<Establishment> establishments = filter.ToList();
IQueryable筛选器=(来自_context.restitutions中的x)
将t加入x上的_context.restitution_类别中。Id等于t.restitutionID
在t.CategoryId等于q.Id上的_context.Categories中加入q
其中x.Name.ToUpper()包含(search.ToUpper())
选择新机构
{
Id=x.Id,
Name=x.Name,
CategoryId=q.Id,
CategoryName=q.名称,
}).采取(1)项措施;
列表机构=filter.ToList();
结果:
顺便说一句,假设返回的数据中存在重复项,您可以在linq之后添加
.Distinct()
方法来删除重复项。之所以有重复的建立
s,是因为您在建立
类别中有两条建立
等于1
的记录。您了解join
的工作原理吗?您使用的EF版本是什么:EF 6.x/EF Core 2.0/EF Core 2.1/EF Core 3.x?因此,您的分类表定义了许多关系。您的结果集当前将为这些多个联接中的每个联接返回一条记录。因此,如果您只需要关系的一条记录,则需要决定要排除哪些行…感谢您的帮助。我理解你的评论,但在解释中我不能做foreach循环,因为它不是一个列表。我尝试使用.Distinct()但我做错了什么。如果我尝试只筛选机构和类别,并执行不同的操作,我只会得到我想要的结果。我可以在第一个结果中添加其他过滤器吗?像Establish\u filter=Establish\u filter……根据您提供的代码,您是否已经返回了两个不同对象的集合?那么你的具体需求是什么,请原谅我不理解你的意思。
IQueryable<Establishment> filter = (from x in _context.Establishments
join t in _context.Establishment_Categories on x.Id equals t.EstablishmentId
join q in _context.Categories on t.CategoryId equals q.Id
where x.Name.ToUpper().Contains(search.ToUpper())
select new Establishment
{
Id = x.Id,
Name = x.Name,
CategoryId = q.Id,
CategoryName = q.Name,
}).Take(1);
List<Establishment> establishments = filter.ToList();