【问题标题】:Need help converting a Linq query (Silverlight RIA Entity - Oracle DB)需要帮助转换 Linq 查询(Silverlight RIA 实体 - Oracle DB)
【发布时间】:2011-05-13 20:53:47
【问题描述】:

我对 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 ?????
}

非常感谢!

【问题讨论】:

    标签: oracle silverlight-4.0 linq-to-entities ria dotconnect


    【解决方案1】:

    对此没有简单的答案。 LINQ to Database Provider 的特点之一是某些查询会立即执行,而另一些则不会。聚合函数(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() 方法)相同的泛型类型。

    【讨论】:

    • 好的,谢谢。如果有人知道 LINQ 语句,我会选择 .ToList() 。我假设我做了一个 .Load(EntityQuery)?这对我来说很好。
    • 我无法访问用于 devart 解决方案的数据库,但我可以将其传递给那些人。我不知道我们是否使用了 devart 实体模型。因此,如果有人有 LINQ 语句,我会同时尝试 .ToList()。
    【解决方案2】:

    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 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2021-12-18
      相关资源
      最近更新 更多