我在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;
}
这使它非常具有可扩展性?如果它是正常的我可以做到这一点,但查询不在哪里
谢谢。
答案 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 }
}