Sql server 连接多个表时避免linq查询中的重复记录
我的数据库中有以下选项卡Sql server 连接多个表时避免linq查询中的重复记录,sql-server,wpf,linq,entity-framework,Sql Server,Wpf,Linq,Entity Framework,我的数据库中有以下选项卡 TestPack { id, name, type } Documentation { id, tp_id, date, rev } Flushing { id, tp_id, date, rev } tp_Id是TestPack Id,是文档和刷新表中的外键,这意味着TestPack可能有1-N个文档和刷新 现在我想使用EF LINQ查询数据库,以返回测试包,以及它们的所有文档和针对一个测试包的刷新,这样我就可以在单个数据网格中显示所有这些信息了 没有任何文档/冲洗
TestPack { id, name, type }
Documentation { id, tp_id, date, rev }
Flushing { id, tp_id, date, rev }
tp_Id是TestPack Id,是文档和刷新表中的外键,这意味着TestPack可能有1-N个文档和刷新
现在我想使用EF LINQ查询数据库,以返回测试包,以及它们的所有文档和针对一个测试包的刷新,这样我就可以在单个数据网格中显示所有这些信息了
没有任何文档/冲洗的测试包也应显示在结果中
这是我到目前为止写的问题
这是查询的结果
基本上在我的测试包表中,我有两个测试包。
测试包1有2份文件和2份冲洗记录,而测试包2只有1份文件和1份冲洗记录。
所以我在这里关心的是testpack1显示了四行,它不应该显示两行吗?因为测试包有两个冲洗和一个测试包的两个文档。那么所有这些都应该显示在两行中?为什么它们显示为四行?我怎样才能纠正这种行为呢?我也陷入了这种困境。这是我的方法:
foreach (var tp in allTestPacks)
{
var lstAllFlh = allFlushings.Where(m => m.TpID == tp.IDTP).ToList();
var lstAllDoc = allDocumentation.Where(m => m.TpID == tp.IDTP).ToList();
foreach (var flh in lstAllFlh)
lstResult.Add(new { TPID = tp.IDTP, TPName = tp.Value, DocName = lstAllDoc.Skip(lstAllFlh.FindIndex(f => f == flh) % lstAllDoc.Count).First().Value, FlushName = flh.Value });
}
我希望该查询返回四项。在测试包1的情况下,您将所有测试包加入到所有文档中,这将在tpDoc中产生2项。然后你加入了tpDoc的所有Flushings;所有Flushings有两项用于测试包1;2乘2等于4。冲洗和文件编制是否相互关联?根据您的期望,对于测试包1,查询应该只返回两行,我认为这两行之间一定存在某种关系;可能是rev字段,也可能是rev和date字段。
foreach (var tp in allTestPacks)
{
var lstAllFlh = allFlushings.Where(m => m.TpID == tp.IDTP).ToList();
var lstAllDoc = allDocumentation.Where(m => m.TpID == tp.IDTP).ToList();
foreach (var flh in lstAllFlh)
lstResult.Add(new { TPID = tp.IDTP, TPName = tp.Value, DocName = lstAllDoc.Skip(lstAllFlh.FindIndex(f => f == flh) % lstAllDoc.Count).First().Value, FlushName = flh.Value });
}