0

我在使用以下代码时遇到问题。在我粘贴之前,让我先介绍一下应该发生什么的历史。

我目前有一个模型,其中包含 2 个感兴趣的字段,即客户下订单的名称,以及他/她下订单的日期。将使用预先计算的日期来查询该dateplaced字段(并且应该只查询日期,而不是时间)。该查询计算 MondayOrder 字段中出现的重复项的数量,并将它们组合在一起。现在,当我排除应该查询日期的 where 子句时,查询运行良好。但是,此查询的目标是根据下订单的日期计算下一周的订单数量。

List<string> returnlist = new List<string>();
DateTime dt = getNextWeekMondaysDate().Date;
switch (day)
{
    case DayOfWeek.Monday: 
    {
        var CountOrders =
           from x in Data.EntityDB.Orders 
           group x by x.MondayOrder into m 
           let count = m.Count() 
           select new
           {
               MondayOrderItem = m.Key, Amount = count 
           };

        foreach (var item in CountOrders)
        {
            returnlist.Add(item.MondayOrderItem + " : " +
               item.Amount);
        }
    }
    break;

getNextWeekMondaysDate()方法有一个我可以使用的重载,如果我为其提供一个日期,它将从给定的参数中获取下一个星期一的日期。但问题是,LINQ 不接受如下查询:

var CountOrders =
    from x in Data.EntityDB.Orders 
    where getNextWeekMondaysDate(x.DatePlaced.Value).Date == dt
    group x by x.MondayOrder into m 
    let count = m.Count() 
    select new { MondayOrderItem = m.Key, Amount = count };

这正是我必须达到的。这种情况有什么解决方法吗?

更新

这是我尝试第二个查询时遇到的异常。

LINQ to Entities 无法识别方法 'System.DateTime getNextWeekMondaysDate(System.DateTime)' 方法,并且此方法无法转换为存储表达式。

4

2 回答 2

3

您不能直接执行此操作,因为 EF 查询提供程序无法将用户定义的方法调用转换为 SQL。提供程序识别一组有限的 .NET 方法,这些方法可以转换为 SQL 以及一些规范函数。除非您编写自己的查询提供程序(这只是理论上的一种选择),否则仅使用这些方法无法表达的任何内容都是禁止的。

作为一种实用的解决方法,您可以在查询之前计算代码中的适当范围,x.DatePlaced.Value然后在子句上使用特定DateTime值。where

作为一项智力练习,请注意此方法 被查询提供程序识别,并可用作表达式的一部分。所以这个可憎的东西也应该起作用:

var CountOrders =
    from x in Data.EntityDB.Orders 
    where EntityFunctions.AddDays(
        x.DatePlaced.Date.Value, 
        (9 - DateAndTime.DatePart(DateInterval.WeekDay, x.DatePlaced.Value)) % 7)
        .Date == dt
    group x by x.MondayOrder into m 
    let count = m.Count() 
    select new { MondayOrderItem = m.Key, Amount = count };
于 2012-05-23T09:40:50.940 回答
2

Linq to Entities 不知道如何将任意 C# 方法转换为 SQL——这通常是不可能的。

所以,你必须使用它理解的方法。

在这种情况下,您可以执行以下操作:

DateTime weekBegin = CalculateWeekBegin( dt );
DateTime weekEnd = CalculateWeekEnd( dt );

var CountOrders =
  from x in Data.EntityDB.Orders 
  where x.DatePlaced.Value >= weekBegin && x.DatePlaced.Value < weekEnd
  group x by x.MondayOrder into m 
  let count = m.Count() 
  select new { MondayOrderItem = m.Key, Amount = count });
于 2012-05-23T09:41:55.073 回答