繁体   English   中英

需要帮助来转换Linq查询(Silverlight RIA实体-Oracle DB)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM