Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use a sql function (coalesce or isnull) in Simple.Data

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!

like image 200
EricP Avatar asked Jan 21 '26 14:01

EricP


2 Answers

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);
like image 147
Mark Rendle Avatar answered Jan 23 '26 03:01

Mark Rendle


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
like image 25
Cᴏʀʏ Avatar answered Jan 23 '26 03:01

Cᴏʀʏ