[英]Need help converting a Linq query (Silverlight RIA Entity - Oracle DB)
我对SQL没问题,但是发现Linq有点混乱。 C#、. NET4,Silverlight,RIA服务,Oracle DB(v?),运行Devart dotConnect 6.10.121的VS2010。
我有一个RIA实体
public sealed partial class ProcessLogHdr : Entity
{
DateTime JobDate;
string InterfaceName;
int SuccessfulCount;
int FailCount;
int TotalCount;
}
还有更多字段,例如用户等,将不适用于此帖子。 有很多工作组成一个过程。 每个作业在此表中都有一个条目,但是我想要的视图是按摘要分组的日期。
我将在查询中调用context.Load,并在其中传递开始日期和结束日期,在Oracle中看起来像这样:
select
trunc(JobDate),
InterfaceName,
sum(SuccessfulCount) as Total_Pass,
sum(FailCount) as Total_Fail,
sum(TotalCount) as Total,
max(JobDate) as Last_Msg_Processed_At_DT
from
ProcessLogHdrsEntity
where
JobDate >= START_DATE_IN_VAR and
JobDate <= END_DATE_IN_VAR
group by
trunc(JobDate),
InterfaceName
order by
trunc(JobDate) desc,
InterfaceName asc;
conttext.Load将从返回IQueryable的方法中调用linq查询。 linq语句必须在Oracle的Devart dotConnect下为Oracle运行。 我猜我需要一些自定义类来保存结果,例如ProcessLogHdrDateSummary。
如果你们可以帮助我填写缺少的内容? linq,我将非常感激:
public IQueryable<ProcessLogHdrDateSummary> GetProcessLogHdrsDateSummary(DateTime START_DATE_IN_VAR, DateTime END_DATE_IN_VAR)
{
return ?????
}
非常感谢!
没有简单的答案。 LINQ对数据库提供程序的特征之一是某些查询立即执行,而其他查询则不执行。 聚合函数(MAX,MIN等)立即返回。 一些指定特定输出的LINQ函数也是如此,例如.First()。 返回集合的所有内容都可能不会立即执行,并且将返回某种IQueryable <>。
什么类型? 这取决于LINQ语句的select子句指定的内容(这与生成的SQL select子句不同)。 “从db.customers中的c中的c中返回”客户对象,但是您也可以使用select子句填充其他类或匿名类。
如果LINQ查询返回IQueryable <>,请记住该查询尚未执行! 在开始处理数据之前,它不会执行。 您必须在仍处于数据上下文范围内的同时处理数据,因为一旦处理完,您将失去数据库连接。
您始终可以通过以.ToList()、. ToArray()、. ToDictionary()或其他一些结尾来强制执行IQueryable <>。 List <>将使用与IQueryable <>和LINQ语句的select子句(或.Select()方法)相同的通用类型。
LINQ查询将相当复杂。 我建议您按照以下步骤操作:
1.使用out游标创建一个存储过程:
CREATE PROCEDURE myQuery(
DATE START_DATE_IN_VAR,
DATE END_DATE_IN_VAR,
cur out sys_refcursor) AS
BEGIN
OPEN cur FOR SELECT
trunc(JobDate),
InterfaceName,
sum(SuccessfulCount) as Total_Pass,
sum(FailCount) as Total_Fail,
sum(TotalCount) as Total,
max(JobDate) as Last_Msg_Processed_At_DT
from
ProcessLogHdrsEntity
where
JobDate >= START_DATE_IN_VAR and JobDate <= END_DATE_IN_VAR
group by
trunc(JobDate), InterfaceName
order by
trunc(JobDate) desc, InterfaceName asc;
END;
2.将此过程添加到模型中。 如果使用的是Devart实体模型,则可能会生成返回类型。 在其他情况下,您将需要创建一个实体或复杂类型,以表示所生成方法的返回类型。
3.将方法调用视为普通的DomainService方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.