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:在LINQ中使用数据透视表_C#_Linq_Linq To Sql_Associations_Inner Join - Fatal编程技术网

C# LINQ:在LINQ中使用数据透视表

C# LINQ:在LINQ中使用数据透视表,c#,linq,linq-to-sql,associations,inner-join,C#,Linq,Linq To Sql,Associations,Inner Join,有人能帮忙吗 我有以下使用关联的结构,如您所见,v.StructureType.Description作为1对1关联非常有效,但我需要在下面的示例中了解v.StructureGroup.StructureGroupTaffices.Taffices.Price,但StructureGroupTaffices是链接StructureGroup和Taffices的透视表,因此它是多对多的,所以它返回一个EntitySet,我现在理解这个问题,但我不确定如何修复它 from v in Hous

有人能帮忙吗

我有以下使用关联的结构,如您所见,v.StructureType.Description作为1对1关联非常有效,但我需要在下面的示例中了解v.StructureGroup.StructureGroupTaffices.Taffices.Price,但StructureGroupTaffices是链接StructureGroup和Taffices的透视表,因此它是多对多的,所以它返回一个EntitySet,我现在理解这个问题,但我不确定如何修复它

    from v in Houses
       select new 
       {
          Id = v.Id,
          Color = v.Color.Description,
          StructureType= v.StructureType.Description,
          Price = v.StructureGroup.StructureGroupTariffs. // Tariff.Price doesn't appear because its MANY to ONE
       }
因此,要理解我的StructureGroupPriories是我的枢轴(链接表),我必须传入

                 IdTariff  and  StructureGroupId
这给了我一个1比1。。。所以我想我可以使用structuregroupTafficies.Tafficies.Price???因为这将在StructureGroup和Tariff之间返回1:1

我有点困惑,非常感谢您的帮助


我现在理解了这个问题,但不确定如何解决它。

想想如何用SQL解决这种查询,我想你可以应用这种推理。编写这种联接有两种主要方法:第一种是使用从主表到联接表,再到结果表的内部联接,并使用适当的过滤器。如果不小心正确筛选联接,则每个主表都会得到多行(这就是为什么要得到EntitySet的原因。如果对该实体集使用.FirstOrDefault(),则会得到要查找的实体(假设已筛选到单个结果:如果没有,则会得到一些随机结果)

另一种方法是编写子查询,例如

Price = (from t in v.StructureGroup.StructureGroupTariffs.Tariffs 
where t.StructionGroupID = v.StructureGroupID 
and t.IdTariff = *not sure where this filter comes from*
select t.Price).First()
上面缺少的过滤器对于第一种方法来说也是一个问题:无论哪种方法,您都需要唯一地标识您想要的t.价格

下面是一个内部连接的示例(从我的模式中简化),其中文档是通过Doc_DocTag表使用DocTag的多对多

from d in Docs 
join ddt in Doc_DocTags on d.DocGuid equals ddt.DocGuid
join dt in DocTags on ddt.DocTagID equals dt.DocTagID
select new {
    d.DocName, dt.DocTagName
}
如果我只想要一个标签:

from d in Docs 
join ddt in Doc_DocTags on d.DocGuid equals ddt.DocGuid
join dt in DocTags on ddt.DocTagID equals dt.DocTagID
where dt.DocTagName == "Target"
select new {
    d.DocName, dt.DocTagName
}

这将只找到带有Target标记的文档(这将进一步确保不可能有多个doctag)。

谢谢!!我已经注意到了innerjoin方式,但我也测试了这个Price=v.StructureGroup.structureGroupPrices.FirstDefault().现在我可以看到所有细节-当然,正如你所说的随机。我如何过滤它..我是否使用all(和一些λ)?基本上要正确过滤它,我需要通过(一些如何)IdTariff和StructureGroupId到作为透视表的StructureGroupTariff表。例如,如果我传入IdTariff=10和StructureGroup=5,我只得到一条记录……我非常感谢您在这里提供的任何评论,因为它看起来会起作用。我们从哪里了解正确的IdTarif?如果它在v(基表)中那么子查询缺少的部分就是t.IdTariff=v.IdTariff。在您的原始查询中,最好通过具有相同性质的join来获得它。如果您能提供这些信息,我可以举出一个例子。