2013-10-16 40 views
4

我有SQL查询,我想用linq重写它。这个sql命令只能连接两个表并在它们上面进行分组。问题在小组中。当我在一个表上使用group by时,一切正常,linq commant返回与sql命令相同的结果。但是当我想要连接两个表然后按H.Ucet(例如)分组时,它会返回其他结果作为我的sql命令。结果与使用左连接时相同,但我需要默认的内连接。Linq组由多个表和内部联接

这是SQL命令:

string dotazBankUcty = @"SELECT 
H.UCET, 
SUM(H.MD) AS MD, 
SUM(H.DAL) AS DAL , 
SUM(H.MD_M) AS MD_M, 
SUM(H.DAL_ENA) DAL_M, 
MAX(UBUC.KOD) AS KOD 
FROM ACCOUNT H 
inner join UBU on H.UCET = UBU.UCET GROUP BY H.UCET"; 

我试图通过这个LINQ命令重写它。

var accountQuery = new XPQuery<ACCOUNT >(CoreHelper.DataSession); 

var ubuQuery = new XPQuery<UBU>(CoreHelper.DataSession); 

var resultBankyUcty = (from h in accountQuery 
    join u in ubuQuery on h.CompoundKey1.UCET equals u.UCET 
    group new { h, u } by new { h.CompoundKey1.UCET } into gUcty 
        select new 
        { 
        Ucet = gUcty.Key.UCET, 
        MD = gUcty.Sum(k => k.h.MD), 
        DAL = gUcty.Sum(k => k.h.DAL), 
        MD_M = gUcty.Sum(k => k.h.MDM), 
        DAL_M = gUcty.Sum(k => k.h.DALM), 
        KOD = gUcty.Max(k => k.u.KOD) 
        }); 

任何人都可以帮我吗?我看不到错误。

+0

我使用devexpress,devexpress是否有可能改写内连接到左连接?在输出中还有行值为空的行。 – mik3s

+0

看起来不那么...... – Virus

+0

内联接基本上是与过滤行的左连接,在你的情况下'u'为null。所以最简单的解决方法是添加'where u!= null'条件。 – Krzysztof

回答

9
from t in (
      from h in accountquery 
      join u in ubuQuery on h.CompoundKey1.UCET equals u.UCET 
      select new {h,u} 
      ) group t by new {t.h.CompoundKey1.UCET} into g 

      select new { 
        Ucet = g.Key.UCET, 
        MD = g.Sum(k => k.h.MD), 
        DAL = g.Sum(k => k.h.DAL), 
        MD_M = g.Sum(k => k.h.MDM), 
        DAL_M = g.Sum(k => k.h.DALM), 
        KOD = g.Max(k => k.u.KOD) 
       }; 
+0

它返回相同的结果。我没有数据库中的外键。可能是一个问题呢? – mik3s

+0

你能否提供表格细节和模式?使用它来发布你的表架构http://sqlfiddle.com/#!3 –

+0

INNER JOIN不能用于Xpo层,我必须使用LEFT OUTER JOIN和WHERE!= null – mik3s