0

我对 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 语句必须在 Devart dotConnect for Oracle 下为 Oracle 运行。我猜我需要一些自定义类来保存结果,比如 ProcessLogHdrDateSummary。

如果你们能帮我填补缺失的东西????? linq,我将不胜感激:

public IQueryable<ProcessLogHdrDateSummary> GetProcessLogHdrsDateSummary(DateTime START_DATE_IN_VAR, DateTime END_DATE_IN_VAR)
{
    return ?????
}

非常感谢!

4

2 回答 2

0

对此没有简单的答案。LINQ to 数据库提供程序的特点之一是某些查询会立即执行,而另一些则不会。聚合函数(MAX、MIN 等)立即返回。一些指定特定输出的 LINQ 函数也是如此,例如 .First()。任何返回集合的东西都可能不会立即执行,并且会返回某种类型的 IQueryable<>。

哪种类型?这取决于 LINQ 语句的 select 子句指定的内容(与生成的 SQL select 子句不同)。“from c in db.customers select c”返回客户对象,但您也可以使用 select 子句填充其他类或匿名类。

如果 LINQ 查询返回 IQueryable<>,请记住查询尚未执行!在您开始处理数据之前,它不会执行。您必须在数据上下文范围内处理数据,因为一旦处理完毕,您就失去了数据库连接。

您始终可以通过以 .ToList()、.ToArray()、.ToDictionary() 或其他一些结尾来强制执行 IQueryable<>。List<> 将使用与 IQueryable<> 和 LINQ 语句的 select 子句(或 .Select() 方法)相同的泛型类型。

于 2011-05-13T00:33:31.360 回答
0

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 Entity 模型,则可能会生成返回类型。在其他情况下,您将需要创建一个实体或复杂类型来表示生成方法的返回类型。

3. 将方法调用视为通常的 DomainService 方法。

于 2011-05-13T12:53:47.650 回答