帮助linq加入

时间:2009-10-29 20:00:02

标签: linq linq-to-sql inner-join

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

但它不会让我提供使用“V”面的地方,因此v​​.IdOFfice无效。 我尝试过交换连接,发生了什么我不能使用“GVT”..

指定它完美的工作位置,但我需要指定2个表中存在的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
      }

基本上,我最终得到1个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;
    }

这使它非常具有可扩展性?如果它是正常的我可以做到这一点,但查询不在哪里

谢谢。

1 个答案:

答案 0 :(得分:1)

您正在此处进行群组加入,因为您正在使用into。这意味着对于每个gvt,您没有一个Item,但可能有几个(或没有)。所有项目的列表都存储在j中,作为IEnumerable<Item>。如果您想选择至少有一个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 }
}