帮助linq加入

帮助linq加入,linq,linq-to-sql,inner-join,Linq,Linq To Sql,Inner Join,我在linq中有下面的表达式,它是一个连接,我选择进入J,因为我以后需要使用J,目前我只选择J,但一旦我有了这个固定的表达式,我计划在以后的另一个子查询中使用J 但它不允许我提供一个使用V侧的示例,因此V.I办公室无效。 我试过在连接处交换,结果我不能使用GVT 通过指定它工作的位置,我非常完美,但我需要指定2个表中的位置。。。因此,IdOffice和IdTariff都在各自的表格中。。他们不都是 (from gvt in Tariffs join v in Items on gvt.IdGro

我在linq中有下面的表达式,它是一个连接,我选择进入J,因为我以后需要使用J,目前我只选择J,但一旦我有了这个固定的表达式,我计划在以后的另一个子查询中使用J

但它不允许我提供一个使用V侧的示例,因此V.I办公室无效。 我试过在连接处交换,结果我不能使用GVT

通过指定它工作的位置,我非常完美,但我需要指定2个表中的位置。。。因此,IdOffice和IdTariff都在各自的表格中。。他们不都是

(from gvt in Tariffs
join v in Items
on gvt.IdGroupItem equals v.IdGroupItem 
into j
where v.IdOffice == 1 && gvt.IdTariff == 111
select j).Take(50)
可能有点傻,看来表后指定的连接我在哪里用不了

有什么想法吗

谢谢

这基本上就是我想要达到的目标

from gvt in Tariffs
  join v in Items
  on gvt.IdGroupItem equals v.IdGroupItem 
  into j
  where v.IdOffice == 1 && gvt.IdTariff == 111
  select new
  {
      id = v.IdItem
      Tariff = from j
      {
    test = j.TariffDesc,
        test1 = j.TariffPrice
      }
基本上,我最终得到了一条Id为的记录和一个包含尽可能多关税的字段——如果这有意义的话

}

我工作得很好

如果能够使用像这样的扩展方法c,那就太好了。。。这是可能的,所以我可以动态设置关税。。。例如,我做查询,我有一个扩展方法,我已经在像这样的简单查询中使用了

    public static IQueryable<Models.ItemTariffCol> WithTariffId(this IQueryable<Models.ItemTariffCol> qry, int tariffId)
    {
        return from t in qry
               where t.IdTarifa == tariffId
               select t;
    }
这使得它非常可扩展?如果这是一个正常的where,我可以这样做,但查询不在where中

谢谢。

由于您使用了into,因此您在这里进行了一次群组加入。这意味着对于每个gvt,您没有一个项目,但可能有几个或没有。所有项目的列表以IEnumerable的形式存储在j中。如果要选择至少有一个IdOffice==1项的所有关税,则可以如下操作:

from gvt in Tariffs
join v in Items
     on gvt.IdGroupItem equals v.IdGroupItem 
     into j
where gvt.IdTariff == 111 && j.Any(v => v.IdOffice == 1)
...
在答案编辑之后,你似乎也从错误的方向开始了——就我所见,你想要的是每个项目的关税清单,而不是每个关税的项目清单。为此,您需要反向加入:

from item in Items
join tariff in Tariffs
     on item.IdGroupItem equals tariff.IdGroupItem 
     into tariffs
where item.IdOffice == 1
select new
{
    Id = item.IdItem,
    Tariffs = from tariff in tariffs
              where tariff.IdTariff == 111
              select new { tariff.TariffDesc, tariff.TariffPrice }
}
或者,您也可以在连接中过滤关税:

from item in Items
join tariff in (from t in Tariffs where t.IdTariff == 111 select t)
     on item.IdGroupItem equals tariff.IdGroupItem 
     into tariffs
where item.IdOffice == 1
select new
{
    Id = item.IdItem,
    Tariffs = from tariff in tariffs
              select new { tariff.TariffDesc, tariff.TariffPrice }
}

谢谢PAvel,我更新了我的原始问题,基本上是我想要达到的目标,你会看到我在更进一步地使用J。。这有用吗?非常感谢这很有效!,我不知道上次我能否打扰你一次。。我需要使用扩展方法扩展查询。。我将更新我的问题,以便我可以使用代码格式…我已经更新了我的原始问题,我想我已经正确地解释了它。。。。感谢您的持续帮助…为了更具体地说明item.IdOffice,我可以使用一个简单的扩展方法,这样我可以使用扩展方法传递一个值,因此原始查询可以重新调用所有内容,使用ext方法,我可以说WithOffice1例如,您可以从我的答案中的查询中删除where,然后,在扩展方法中的Id字段上进行筛选。但是,您需要定义一个命名类型,因为您不能声明方法扩展或不接受匿名类型的参数;你能澄清关于它的问题是什么吗?谢谢Pavel,我将在代码中插入并尝试检查扩展方法,如果可以的话,我会很快回来检查。。再次感谢