| .NET Function | Jet | MySql | Oracle | PostgreSQL | Sqlite | SqlServer |
|---|---|---|---|---|---|---|
| DbFunc.Random | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| DbFunc.Concat | ❌ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
| DbFunc.DateTime | ❌ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
For example, EntityFramework can not translate this expression:
.Where(x => new DateTime(x.Year, x.Month, x.Day) > DateTime.Now);So, we provide another function to support this:
.Where(x => DbFunc.DateTime(x.Year, x.Month, x.Day) > DateTime.Now);If use MySQL, the generated SQL is:
WHERE STR_TO_DATE(CONCAT(`x`.`Year`, '-', `x`.`Month`, '-', `x`.`Day`), '%Y-%m-%d') = CURRENT_TIMESTAMP();In SQLServer
Use:
.Where(x => DbFunc.DateTime(x.Year, x.Month, x.Day) > DbFunc.DateTime(2012, 4, 16));CONVERT(DATETIME, CONCAT([x].[Year], N'-', [x].[Month], N'-', [x].[Day])) > CONVERT(DATETIME, CONCAT(2012, N'-', 4, N'-', 16))
!! Not Use:
// Wrong
.Where(x => DbFunc.DateTime(x.Year, x.Month, x.Day) > new DateTime(2012, 4, 16));/* Wrong */
WHERE CONVERT(DATETIME, CONCAT([x].[Year], N'-', [x].[Month], N'-', [x].[Day])) > TIMESTAMP '2012-04-16T00:00:00.0000000'
In MySql
Everything is OK.
.Where(x => DbFunc.DateTime(x.Year, x.Month, x.Day) > DbFunc.DateTime(2012, 4, 16));WHERE STR_TO_DATE(CONCAT(`x`.`Year`, '-', `x`.`Month`, '-', `x`.`Day`), '%Y-%m-%d')
> STR_TO_DATE(CONCAT(2012, '-', 4, '-', 16), '%Y-%m-%d');Or
.Where(x => DbFunc.DateTime(x.Year, x.Month, x.Day) > new DateTime(2012, 4, 16));WHERE STR_TO_DATE(CONCAT(`x`.`Year`, '-', `x`.`Month`, '-', `x`.`Day`), '%Y-%m-%d')
> '2012-04-16 00:00:00.000000';