Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq查询在左外部联接后返回重复数据_C#_Linq - Fatal编程技术网

C# Linq查询在左外部联接后返回重复数据

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

表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连接到上的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行的所有描述值的列表
与[客户1,订单1][客户1,订单2][客户2,订单3]等重复组合相比,“有订单的客户”感觉更自然。GroupJoin的另一个优势是每个客户的数据只传输一次

一个主要区别是:使用左外部联接,您将无法获得没有订单的客户。使用GroupJoin,您将拥有所有客户,即使他们没有订单。如果您不想这样做,请添加一个简单的地址:

// 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字段。因此您可以得到:和