c# - 二元表达式无法转换为 LINQ 中的谓词表达式

标签 c# linq llblgenpro

我想获取某个给定 DateTime 的周数。

public static int WeekOf(DateTime? date)
            {
                if (date.HasValue)
                {
                    GregorianCalendar gCalendar = new GregorianCalendar();
                    int WeekNumber = gCalendar.GetWeekOfYear(date.Value, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
                    return WeekNumber;
                }
                else
                    return 0;
            }

然后我用上面的方法:

public static List<ExpressionListDictionary> MyMethod(int weeknr)
        {
            using (DataAccessAdapter adapter = CreateAdapter())
            {
                LinqMetaData meta = new LinqMetaData(adapter);
                var q = (from i in meta.Test
                         where WeekOf(i.StartDate) == weeknr
                         select new ExpressionListDictionary()
                             {                                 
                                {"SomeId", i.Id}
                             }
                );
                return q.ToList();
            }
        }

最后:

    List<ExpressionListDictionary> someIDs =  MyMethod(weeknr);
/* weeknr = 19 -> step by step debugging */

描述:在执行当前网络请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。

异常详细信息:SD.LLBLGen.Pro.ORMSupportClasses.ORMQueryConstructionException:二进制表达式“(WeekOf(Convert(EntityField(LPLA_1.StartDate AS StartDate))) == 19)”不能转换为谓词表达式。

我确实在返回 q.ToList(); 时收到标题错误; .我怎样才能做到这一点?

最佳答案

我从未使用过 LLBLGen 库/框架...但这可能与 Entity Framework/LINQ-to-SQL 发生的问题相同:您不能放入查询 C# 方法:查询必须由您的数据库服务器执行,而不是在本地执行,并且您的数据库服务器不知道如何执行 C# 代码。所以问题出在 **WeekOf(i.StartDate)** == weeknr 部分代码(这是您查询中唯一的 BinaryExpression)

您发布的异常非常清楚,错误点是我建议的那个。那么原因大概就是我给你的那个。

取自https://www.llblgen.com/tinyforum/Messages.aspx?ThreadID=22861

如果您使用的是支持 DATEPART(isowk, ...) 的 SQL Server(或者如果您使用的是支持 WEEK(...) 的 MySQL)

public class SQLFunctionMappings : FunctionMappingStore
{
    public SQLFunctionMappings()
    {
        Add(new FunctionMapping(
            typeof(SQLFunctions),
            "WeekOf",
            1,
            "DATEPART(isowk, {0})") // For SQL Server
            // "WEEK({0}, 1)") For MySQL
        );
    }
}

public class SQLFunctions
{
    public static int? WeekOf(DateTime? date)
    {
        return null;
    }
}

然后你会像这样使用它:

LinqMetaData meta = new LinqMetaData(adapter) 的行中,添加:

meta.CustomFunctionMappings = new SQLFunctionMappings();

并更改位置:

where SQLFunctions.WeekOf(i.StartDate) == weeknr

Here有 llblgen 已经映射的函数列表,以及如何映射其他函数。

关于c# - 二元表达式无法转换为 LINQ 中的谓词表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30297148/

相关文章:

c# - llblgen 2.6 中相关字段的排序

c# - 基本的 C# 文本冒险被打破

c# - EF Core Linq 使用方法语法加入 OR 条件

c# - LINQ 中的股票数据结转到第二天

c# - 严格使用 LLBLGen Pro 作为 EF4 的设计器

c# - 谓词参数在 C# 中如何在语法上起作用?

c# - 从多个应用程序访问数据库

c# - 我应该让我的私有(private)类方法静态化吗?

c# - 当远程 SQL Server 数据库的 scaffold-DbContext 时,构建失败

c# - 基于另一个不同类型的集合创建一个对象集合