【问题标题】:Convert SQL to LINQ: select the result into model将 SQL 转换为 LINQ:将结果选择为模型
【发布时间】:2013-03-13 10:51:21
【问题描述】:

我不熟悉 LINQ,谁能帮帮我? 提前致谢。

我的模特:

public class OrderOverViewModel
{
    public int Quantity { get; set; }
    public String ACCN { get; set; }
    public DateTime OrderDate { get; set; }
}

这是 SQL:

SELECT COUNT(*) AS HowMany, 
       DATEADD(dd, 0, DATEDIFF(dd, 0, RXS_OrderDate)) AS OrderDate, 
       RXS_ACCN  AS ACCN  
FROM RXS_RxJobs
WHERE DATEDIFF(WK, RXS_OrderDate, GETDATE()) = 1
GROUP BY RXS_ACCN, DATEADD(dd, 0, DATEDIFF(dd, 0, RXS_OrderDate))

SSMS 中的结果:

我希望选择结果填充模型,如何实现? 再次感谢。

【问题讨论】:

  • 是 LINQ to SQL 还是 LINQ to Entities?到目前为止,您尝试过什么?
  • @lazyberezovsky :LINQ to SQL,我可以在 SSMS 中附上结果截图

标签: c# sql linq linq-to-sql linq-to-entities


【解决方案1】:

使用SqlFunctions.DateDiff 方法获取当前日期和订单日期之间的周数。您也可以通过DateTime 对象的Date 属性简单地获取日期的日期部分。查询应如下所示:

from j in context.RXS_RxJobs
    .Where(x => SqlMethods.DateDiffDay(x.RXS_OrderDate, DateTime.Now) >= 7 &&
                SqlMethods.DateDiffDay(x.RXS_OrderDate, DateTime.Now) < 14)
group j by new { j.RXS_ACCN, j.RXS_OrderDate.Date } into g
select new OrderOverViewModel
{
   Quantity = g.Count(),
   ACCN =  g.Key.RXS_ACCN,
   OrderDate = g.Key.Date  
};

更新(Linq to Entities):

from j in context.RXS_RxJobs
    .Where(x => SqlFunctions.DateDiff("wk", x.RXS_OrderDate, DateTime.Now) == 1)
group j by new { 
    j.RXS_ACCN, 
    Date = EntityFunctions.TruncateTime(j.RXS_OrderDate).Value
} into g
select new OrderOverViewModel {
   Quantity = g.Count(),
   ACCN =  g.Key.RXS_ACCN,
   OrderDate = g.Key.Date 
};

【讨论】:

  • @Wayou 很高兴来到这里!
  • @lazyberezovsky:“j.RXS_OrderDate.Date”中的“日期”导致错误:LINQ to Entities 不支持指定的类型成员“日期”。仅支持初始化器、实体成员和实体导航属性。
  • @Wayou 根据错误,您正在使用 Linq to Entities。应该为此修改查询
  • @lazyberezovsky:对不起,这是 LINQ to Entities。现在我将“日期”更改为“日期”,但是如何将 g.Key.Day(int) 分配给 OrderDate(datetime),我想将日期时间存储到 OrderDate 中,如上图所示。
  • @Wayou 我已经用 linq 更新了对实体的回答。这个对我有用。让我知道它是否适用于您的情况
【解决方案2】:
var viewModels = from job in ObjectContext.RXS_RxJobs
where SqlFunctions.DateDiff("Day", RXS_OrderDate,DateTime.Now) == 1
group job by new { RXS_ACCN, OrderDate} into jobGroup
select new OrderOverViewModel
{ 
    Quantity = jobGroup.Count(),
    ACCN =  jobGroup.Key.RXS_ACCN,
    OrderDate = jobGroup.Key.OrderDate
} ;

【讨论】:

  • 也谢谢你。但是,您的代码中有错误。我不知道如何解决它。 VS 说这个工作是在 bleow 中声明的。
猜你喜欢
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多