我想获取某个给定 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/