报告显示原始数据而不是来自linq查询的数据?

时间:2012-08-28 16:01:49

标签: c# winforms c#-4.0 linq-to-sql crystal-reports

我的报告一直在员工字段中显示我认为报告中的原始数据。 sql表具有正确的数据,但报告的名称永远不正确。它始终显示员工的pk为零,而不是联接中的员工。我想我正在显示来自expenseHdrexpenseDtl字段的正确数据,因为它在报告中看起来正确但当我在调试时将鼠标悬停在查询上时,我看到的是费用明细(订单项中的我的报告)但我是视觉工作室的新手。

基本上,我的查询与数据源之间似乎存在脱节,或者我的加入存在问题。这是我从数据源获得的sql选择,下面是查询。任何帮助将不胜感激。

SELECT DISTINCT expenseHdr.rptNo,expenseHdr.description,expenseHdr.purpose,
expenseHdr.reimbursement, expenseHdr.department, expenseHdr.period, 
expenseDtl.expDesc, expenseDtl.expType, expenseDtl.expCost, 
expenseDtl.expDate, employees.name, expenseDtl.expNo,   
expenseDtl.location
FROM   (Intranet.dbo.expenseHdr expenseHdr INNER JOIN
Intranet.dbo.expenseDtl expenseDtl ON 
expenseHdr.rptNo=expenseDtl.rptNo) INNER JOIN Intranet.dbo.employees 
employees ON expenseHdr.empPk=employees.pk
ORDER BY expenseDtl.expNo
private void launchReport(int pKReport)
{
    using (DataClasses1DataContext db = new DataClasses1DataContext())
    {
        var query = (from s in db.expenseHdrs
                         join d in db.expenseDtls on s.rptNo equals d.rptNo
                         where s.rptNo == pKReport
                         join g in db.employees on s.empPk equals g.pk
                         select new
                         {
                             s.period,
                             s.description,
                             s.department,
                             s.rptNo,
                             s.reimbursement,
                             s.purpose,
                             g.name,
                             d.expDate,
                             d.expType,
                             d.expDesc
                     });

        expenseReportMain cr1 = new expenseReportMain();

        cr1.FileName = @"\\SRV-NAS\Intranet\Reports\expenseReportMain.rpt";

        ConnectionInfo connectionInfo = new ConnectionInfo();
        connectionInfo.ServerName = "svr-sql";
        connectionInfo.DatabaseName = "intranet";
        connectionInfo.UserID = "sa";
        connectionInfo.Password = "******";

        SetDBLogonForReport(connectionInfo, cr1);
        cr1.SetDataSource(query);
        crystalReportViewer1.ReportSource = cr1;
    }
}

private void SetDBLogonForReport(ConnectionInfo connectionInfo,
                                 expenseReportMain reportDocument)
{
    Tables tables = reportDocument.Database.Tables;
    foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
    {
        TableLogOnInfo tableLogonInfo = table.LogOnInfo;
        tableLogonInfo.ConnectionInfo = connectionInfo;
        table.ApplyLogOnInfo(tableLogonInfo);
    }
}

我还根据请求编辑了一些示例数据:

expenseHdr             expenseDtl                employees

rptNo  empPk           expNo   rptNo             pK    name    userid
1      333             3       1                 333   Tom     tom.b
2      240             4       1                 240   Kelly   kelly.c
3      542             5       2                 542   Jean    jean.g
                       6       3

因此,员工表中的任何信息都无法在报告中正确显示。来自其他两个表的数据显示正常。

2 个答案:

答案 0 :(得分:0)

这是正常的,因为在你的linq治疗中你没有加入运算符,但你选择了很多。

你的SQL查询:你有三个连接的查询

你linq查询:你选择了很多,有两个选择,并且每个选择都有一个连接

所以它总是显示员工的pk为零,而不是来自加入的员工,这是正常的,因为您没有使用expenseHdrs加入员工。

 var query = (from s in db.expenseHdrs
                     join d in db.expenseDtls on s.rptNo equals d.rptNo
                     where s.rptNo == pKReport
                     join g in db.employeess on g.pk equals s.empPk
                     select new
                     {
                        //Adjust your select

                     });

答案 1 :(得分:0)

我记得通过放置两个连接后的位置来更改查询,因为早期的定义可能会起作用:

var query = (from s in db.expenseHdrs
                         join d in db.expenseDtls on s.rptNo equals d.rptNo
                         where s.rptNo == pKReport
                         join g in db.employees on s.empPk equals g.pk
                         select new
                         {
                             s.period,
                             s.description,
                             s.department,
                             s.rptNo,
                             s.reimbursement,
                             s.purpose,
                             g.name,
                             d.expDate,
                             d.expType,
                             d.expDesc
                     });

要:

var query = (from s in db.expenseHdrs
                         join d in db.expenseDtls on s.rptNo equals d.rptNo
                         join g in db.employees on s.empPk equals g.pk
                         where s.rptNo == pKReport
                         select new
                         {
                             s.period,
                             s.description,
                             s.department,
                             s.rptNo,
                             s.reimbursement,
                             s.purpose,
                             g.name,
                             d.expDate,
                             d.expType,
                             d.expDesc
                     });

将解决您的问题,因为在sql中您需要在where子句之前加入所有表。