【问题标题】:Help with linq join帮助 linq 加入
【发布时间】:2009-10-29 20:00:02
【问题描述】:

我在 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;
    }

这使它非常可扩展?如果它是正常的,我可以这样做,但查询不在哪里

谢谢。

【问题讨论】:

  • 您使用扩展方法的示例在编写时应该可以正常工作;你能澄清一下关于它的问题吗?
  • 谢谢 Pavel,我将插入我的代码并尝试检查其上的扩展方法,如果没问题,我会尽快回来查看。再次感谢

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


【解决方案1】:

您正在此处加入群组,因为您使用的是into。这意味着对于每个gvt,您没有一个Item,但可能有几个(或没有)。所有项目的列表存储在j 中,作为IEnumerable&lt;Item&gt;。如果您想选择至少有一项带有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.. 这有帮助吗?
  • 非常感谢,这很好用!,我想知道我上次能不能打扰你 1.. 我需要使用扩展方法扩展查询.. 我会更新我的问题,以便我可以使用代码格式化...
  • 我已经更新了我原来的问题,我想我已经正确解释了......感谢您的持续帮助......
  • 更具体地说,item.IdOffice 我可以使用一个简单的扩展方法,因此我可以使用扩展方法将值传递给它,因此原始查询将返回所有内容,使用 ext 方法我可以说 WithOfficeId( 1)例如
  • 您只需从我的答案中的查询中删除where,然后在您的扩展方法中过滤Id 字段。但是,你需要定义一个命名类型,因为你不能声明一个方法(扩展或否)接受匿名类型的参数。
猜你喜欢
  • 2011-07-21
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多