I am porting a sql query to Simple.Data, the original query is something like:
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()
I've been able to port everything in the query except for that darn coalesce logic:
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);
Any thoughts on how to get the coalesce behavior in there? I've tried using the ?? operator to no avail.
Thanks in advance!
When there is a SQL function which takes a column name as its first parameter, you can specify it as a method on the column:
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);
Note that if you have referential integrity set up between TableA and TableB, you can leave out the explicit join and simplify this query to:
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);
I've never used Simple.Data before, but I think you want to do this:
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);
Or move it out of the join:
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);
What is the data type for db.TableB.SomeDate? If Simple.Data generates it as a nullable data type (Nullable<DateTime>) then you could do:
db.TableB.SomeDate.GetValueOrDefault(nullDate) <= currentDate
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With