C# Linq查询在左外部联接后返回重复数据
表1和表2都有唯一的记录,我需要离开外部连接以从表2中获取DESCR 表1:C# Linq查询在左外部联接后返回重复数据,c#,linq,C#,Linq,表1和表2都有唯一的记录,我需要离开外部连接以从表2中获取DESCR 表1: ID SUBJECT CATALOG_NBR ... SUBJECT CATALOG_NBR DESCR ... 表2: ID SUBJECT CATALOG_NBR ... SUBJECT CATALOG_NBR DESCR ... 然而,在左外连接之后,我得到了两个记录。我尝试了groupby,但仍然返回重复项。以下是我的疑问: IQueryable qry=(来自db.table1中的a 将b连接到上的d
ID
SUBJECT
CATALOG_NBR
...
SUBJECT
CATALOG_NBR
DESCR
...
表2:
ID
SUBJECT
CATALOG_NBR
...
SUBJECT
CATALOG_NBR
DESCR
...
然而,在左外连接之后,我得到了两个记录。我尝试了groupby,但仍然返回重复项。以下是我的疑问:
IQueryable qry=(来自db.table1中的a
将b连接到上的db.table2中
新的{SUBJECT=a.SUBJECT,CATALOG_NBR=a.CATALOG_NBR}等于
新{SUBJECT=b.SUBJECT,CATALOG_NBR=b.CATALOG_NBR}
从ab.DefaultIfEmpty()中的x进入ab
选择新的joinedTable()
{
ID=a.ID,
主语,主语,
目录编号=a.目录编号,
DESCR=x.DESCR
}
.GroupBy(a=>a.ID)
.Select(a=>a.FirstOrDefault())
.AsQueryable();
我的查询有什么问题吗?谢谢。所以表1和表2的行有一个主题和一个CatalogNr。您想要“表1的行,每个表1的行中有零行或多行具有相同的主题和CatalogNr值” 每当您想要具有零或多个子项目的项目时,如客户订单,学校与学生,表1行,表2行,考虑使用其中的一个重载。 简言之:
- 从表1中的每一行创建一个包含该行的主题和CatalogNr的新对象
- 从表2中的每一行创建一个新对象,其中包含该行的主题和CatalogNr
- 对于Table1中的每一行以及Table2中的所有零行或多行匹配行,创建一个新对象,其中包含Table1中该行的多个属性,以及一个属性描述,该属性描述是匹配Table2行的所有描述值的列表
// keep only the table1 items that have at least one matching table2 item
.Where(groupJoinResult => groupJoinResult.Descriptions.Any())
如果你真的想要一个扁平的左外连接,请使用SelectMany。我个人认为没有适当的理由这样做。不要使用new{SUBJECT=a.SUBJECT,CATALOG\u NBR=a.CATALOG\u NBR}使用new{a.SUBJECT,a.CATALOG\u NBR}.Linq不知道如何与命名对象进行比较。主题字符串和目录字符串都是吗?谢谢。是的。它们都是字符串。我尝试了你的方法,但它仍然返回重复的。你有重复的ID?每个ID应该只有一个。看起来你缺少GroupBy:}之前的括号。GroupBy(a=>a.ID)。选择(a=>a.FirstOrDefault()).AsQueryable();ID字段在表1中是唯一的整数。表2没有ID字段。因此您可以得到:和