3

我正在将 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);

关于如何在那里获得合并行为的任何想法?我试过使用??运算符无济于事。

提前致谢!

4

3 回答 3

10

当有一个 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);
于 2012-02-27T13:42:58.303 回答
1

我以前从未使用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将其生成为可为空的数据类型 ( Nullable<DateTime>),那么您可以执行以下操作:

db.TableB.SomeDate.GetValueOrDefault(nullDate) <= currentDate
于 2012-02-23T17:30:12.343 回答
0

Coalesce 在这里毫无用处。

where coalesce(b.SomeDate, '1/1/1900') <= getdate()

这本质上意味着如果 b.SomeDate 为 null 则返回 true,因为 getdate() 永远不会 <= 1/1/1900。你可以用这个替换上面的......

where (b.SomeDate is null) or (b.SomeDate <= getdate())

这可能会简化一点......

于 2012-02-23T21:10:10.913 回答