二进制表达式无法转换为LINQ中的谓词表达式

Flo*_* M. 6 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;
            }
Run Code Online (Sandbox Code Playgroud)

然后我使用上面的方法:

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();
            }
        }
Run Code Online (Sandbox Code Playgroud)

最后:

    List<ExpressionListDictionary> someIDs =  MyMethod(weeknr);
/* weeknr = 19 -> step by step debugging */
Run Code Online (Sandbox Code Playgroud)

描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息: SD.LLBLGen.Pro.ORMSupportClasses.ORMQueryConstructionException:二进制表达式'(WeekOf(转换(EntityField(LPLA_1.StartDate AS StartDate)))== 19)'无法转换为谓词表达式.

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

xan*_*tos 3

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

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

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

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你会像这样使用它:

在有 的行处LinqMetaData meta = new LinqMetaData(adapter)添加:

meta.CustomFunctionMappings = new SQLFunctionMappings();
Run Code Online (Sandbox Code Playgroud)

并更改where

where SQLFunctions.WeekOf(i.StartDate) == weeknr
Run Code Online (Sandbox Code Playgroud)

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