c#linq to使用基于方法的查询的实体 - 尝试选择对象只出现一次的位置

时间:2014-05-20 23:12:41

标签: c# sql linq

我有这个表将表硬件与表Process相关联。 这个表叫做processHardware。 该表描述如下:     IDProcessHardware     IDProcess     IDHardware     状态

场状态可以有3种状态(1-Insert,2-Remove,3-Substitute).. 所以我可以拥有这个:

IDProcessoHardware  IDProcesso  IDHardware State

  1                  10          1        1

  2                  10          2        1

  3                  10          1        2

这告诉我的是id为1的硬件是在id为10的进程上插入的 然后用户在id为10的进程中插入id为2的硬件,并从id为10的进程中删除id为1的硬件

通过给出进程的id我想获得插入的硬件的id,这就是被删除的硬件的id。 所以在这种情况下,我将得到的记录是记录号2 ..因为是插入,但没有删除.. 从这个表中获取ID之后我需要将id与表硬件联系起来,这个表由idhardware,序列号,描述来描述..

我正在使用linq方法基础..

这是我做过的事情,但在此之后没有进一步......

var ProcessoHardware = from procHardware in db.ProcessoHardwares
                       where procHardware.Rem == 0 && procHardware.IDProcesso == IDProcesso
                       group procHardware by procHardware.IDHardware into g
                       select new { IDHardware = g.Key, count = g.Count() };

上面的查询对我没有用... 所以我想得到只在表上出现一次的记录,然后将从这个查询中获得的id关联起来,并获取有关这些id的信息,如序列号,描述(这些字段在名为Hardware的表上)。

提前感谢..

在sql中我设法进行查询..

SELECT * 
FROM 
(SELECT IDHardware ,COUNT(IDHardware) nu 
FROM dbo.ProcessoHardware 
WHERE IDProcesso=47 
Group By IDHardware) T WHERE nu=1

如何将此传递给linq?

1 个答案:

答案 0 :(得分:1)

首先,如果您使用having clause,那么您的SQL语句会更清晰,因此它变为

SELECT IDHardware, COUNT(IDHardware) nu 
FROM dbo.ProcessoHardware 
WHERE IDProcesso=47 
GROUP BY IDHardware
HAVING COUNT(IDHardware) = 1

其次,您的SQL语句没有提到名为Rem的字段,但您的LINQ状态为where procHardware.Rem == 0。我假设您需要保留该过滤器。如果是这样,那么您需要做的就是添加一个where子句来计算您的组,g。请尝试以下

var ProcessoHardware = from procHardware in db.ProcessoHardwares
                       where procHardware.Rem == 0 && procHardware.IDProcesso == IDProcesso
                       group procHardware by procHardware.IDHardware into g
                       where g.Count() == 1
                       select new { IDHardware = g.Key, count = g.Count() };

虽然您的语句(没有Rem和硬编码ID为47)的文字转换为LINQ,但

var ProcessoHardware = from procHardware in db.ProcessoHardwares
                       where procHardware.IDProcesso == 47
                       group procHardware by procHardware.IDHardware into g
                       where g.Count() == 1
                       select new { IDHardware = g.Key, count = g.Count() };