C# EF辅助表中的重复值

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

我正在使用实体框架开发一个web应用程序

我需要为
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();