【发布时间】:2013-12-21 04:16:13
【问题描述】:
我的 NH 查询
exec sp_executesql N'IF @p0 = 1 SET @p1 = DATEADD(d, 1, @p1)
SELECT b.fInvoiceID,
b.fItemID,
b.fAccount,
e.fName AccountName,
b.fDescription,
b.fAmount,
c.fCode CTCode,
f.fDescription CTCodeName,
c.fDescription CTDescription,
c.fAmount CTAmount
FROM tAPInvoice a
INNER JOIN tAPInvoiceDetail b ON a.fInvoiceID = b.fInvoiceID
INNER JOIN tSCLedgerAccount e ON b.fAccount = e.fAccount AND a.fCompanyID = e.fCompanyID
LEFT JOIN tCTActual c ON b.fItemID = c.fAPItemID
LEFT JOIN tCTCode f ON c.fCode = f.fCode AND c.fProjectID = f.fProjectID
LEFT JOIN tAPPayment p ON a.fInvoiceID = p.fInvoiceID
LEFT JOIN tBACheck d ON p.fCheckID = d.fCheckID
INNER JOIN tAPVendor v ON v.fVendorID = a.fVendorID
WHERE
((@p3 = ''Fully Paid'' AND a.fPaid = 1 AND a.fVoid = 0 ) OR
(@p3 = ''Part Paid'' AND a.fPartPaid = 1 AND a.fVoid = 0 ) OR
(@p3 = ''Payment Made'' AND a.fPartPaid = 1 AND a.fVoid = 0 ) OR
(@p3 = ''Payment Made'' AND a.fPaid = 1 AND a.fVoid = 0 ) OR
(@p3 = ''Pending'' AND a.fPaid = 0 AND a.fPartPaid = 0 AND a.fVoid = 0 AND a.fPosted = 0 ) OR
(@p3 = ''Posted'' AND a.fPosted = 1 ) OR
(@p3 = ''Unpaid'' AND a.fPaid = 0 AND a.fPartPaid = 0 AND a.fVoid = 0 ) OR
(@p3 = ''Voided'' AND a.fVoid = 1 ) OR
(@p3 = ''All'' ))
AND (@p12 = p.fPaymentType OR @p12 = -1)
AND (CASE WHEN @p0 = 1
THEN a.fEntryDate
ELSE CASE @p3
WHEN ''Fully Paid'' THEN d.fDate
WHEN ''Part Paid'' THEN d.fDate
WHEN ''Payment Made'' THEN d.fDate
WHEN ''Voided'' THEN a.fVoidDate
ELSE a.fPostDate
END
END BETWEEN @p16 AND @p1)
AND (a.fCompanyID = @p18 OR @p18 IS NULL)
AND (a.fPropertyID =@p20 OR @p20 IS NULL)
AND (a.fVendorID = @p22 OR @p22 IS NULL)
AND (a.fUser = @p24 OR @p25 IS NULL)
AND (v.fActive = @p26 OR @p26 IS NULL)
ORDER BY a.fInvoiceNo ASC, b.fItemID, c.fCTID ',N'@p0 bit,@p1 datetime,@p3 nvarchar(4000),@p12 int,@p16 datetime,@p18 nvarchar(4000),@p20 nvarchar(4000),@p22 nvarchar(4000),@p24 nvarchar(4000),@p25 nvarchar(4000),@p26 bit',@p0=0,@p1='2012-10-31 20:35:23',@p3=N'Fully Paid',@p12=-1,@p16='2012-07-01 20:35:23',@p18=NULL,@p20=NULL,@p22=NULL,@p24=NULL,@p25=NULL,@p26=1
下面是我的c#代码
sqlQuery =
session.CreateSQLQuery(finalQuery).
SetGuid("CompanyID", Company.FCompanyID).
SetString("PropertyID", null).
SetString("VendorID", null).
SetDateTime("StartDate", StartDate).
SetDateTime("EndDate", EndDate).
SetString("Username", User).
SetInt32("PaymentMethod", PaymentMethod).
SetString("InvoiceType", invoicetype).
SetString("UserName", User).
SetBoolean("UseEntryDate", UserEntryDate).
SetParameter("Active", Active);
在此之后我使用 SetResultTransformer 方法
var result = sqlQuery.SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean<ReportData_APBI_Detail>()).List();
上面一行用 SetResultTransformer() 方法抛出异常消息
{“超时时间已过。在操作完成之前超时时间已过或服务器没有响应。”}
即使我在 Sql Server 上运行此查询,它也会在 48 秒内给我输出。
【问题讨论】:
-
您是否尝试过增加超时时间?
-
您是否检查过 SQL Server 端以了解发生了什么? NHibernate 的查询可能不是那么理想。顺便说一句,我会不增加超时时间,因为您只会隐藏真正的问题所在(未调整的查询、丢失/未调整的索引或其他问题)。除非您使用非常复杂的查询处理大量数据,否则 48 秒对于查询来说已经很长了。
-
我检查过了,它会在 48 秒内给我结果
-
@SunilNaudiyal 不,我的意思不是在 SQL 管理控制台上运行或多或少相同的查询。我会检查 NH 生成的查询是如何运行的(至少跟踪生成的查询以查看其时间)。
-
我用 NH 查询更新了我的问题,请检查一下。
标签: c# nhibernate