如何在Simple.Data中使用sql函数(coalize或isull)
本文关键字:函数 coalize isull sql Simple Data | 更新日期: 2023-09-27 18:25:31
我正在将一个sql查询移植到Simple.Data,原始查询类似于:
select a.Field1, a.Field2, b.Field1
from TableA a
join TableB b ON a.KeyField = b.KeyField
where coalesce(b.SomeDate, '1/1/1900') <= getdate()
我已经能够移植查询中的所有内容,除了那个该死的合并逻辑:
var currentDate = DateTime.Now;
var result = db.TableA.Query()
.Join(db.TableB).On(db.TableA.KeyField == db.TableB.KeyField &&
db.TableB.SomeDate == currentDate)
.Select(db.TableA.Field1, db.TableA.Field2, db.TableB.Field1);
有没有关于如何在那里实现联合行为的想法?我尝试过使用??
运算符,但没有成功。
提前感谢!
当有一个SQL函数将列名作为其第一个参数时,您可以将其指定为列上的方法:
var currentDate = DateTime.Now;
var defaultDate = new DateTime(1900,1,1);
var result = db.TableA.Query()
.Join(db.TableB).On(db.TableA.KeyField == db.TableB.KeyField &&
db.TableB.SomeDate.Coalesce(defaultDate) <= currentDate)
.Select(db.TableA.Field1, db.TableA.Field2, db.TableB.Field1);
请注意,如果在TableA和TableB之间设置了引用完整性,则可以省略显式联接,并将此查询简化为:
var currentDate = DateTime.Now;
var defaultDate = new DateTime(1900,1,1);
var result = db.TableA
.Query(db.TableA.TableB.SomeDate.Coalesce(defaultDate) <= currentDate)
.Select(db.TableA.Field1, db.TableA.Field2, db.TableB.Field1);
我以前从未使用过Simple.Data
,但我认为您想这样做:
var currentDate = DateTime.Now;
var nullDate = new DateTime(1900, 1, 1);
var result = db.TableA.Query()
.Join(db.TableB).On(db.TableA.KeyField == db.TableB.KeyField &&
((!Object.ReferenceEquals(null, db.TableB.SomeDate) ? db.TableB.SomeDate : nullDate) <= currentDate)
.Select(db.TableA.Field1, db.TableA.Field2, db.TableB.Field1);
或者将其移出加入:
var currentDate = DateTime.Now;
var nullDate = new DateTime(1900, 1, 1);
var result = db.TableA.Query()
.Join(db.TableB).On(db.TableA.KeyField == db.TableB.KeyField)
.Where((!Object.ReferenceEquals(null, db.TableB.SomeDate) ? db.TableB.SomeDate : nullDate) <= currentDate)
.Select(db.TableA.Field1, db.TableA.Field2, db.TableB.Field1);
db.TableB.SomeDate
的数据类型是什么?如果Simple.Data
将其生成为可为null的数据类型(Nullable<DateTime>
),则可以执行以下操作:
db.TableB.SomeDate.GetValueOrDefault(nullDate) <= currentDate
这里的聚结非常无用。
where coalesce(b.SomeDate, '1/1/1900') <= getdate()
这本质上意味着,如果b.SomeDate为null,则返回true,因为getdate()永远不会是<=1900年1月1日。你可以用这个来代替上面的。。。。
where (b.SomeDate is null) or (b.SomeDate <= getdate())
这可能会简化一点。。。