2012-02-23 55 views
3

我移植一個SQL查詢Simple.Data(合併或ISNULL),原來的查詢是這樣的:如何使用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); 

有關如何獲得合併行爲的任何想法?我試過使用??運營商無濟於事。

在此先感謝!

回答

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); 

需要注意的是,如果你有參照完整性表A和表B之間建立了,你可以離開了明確的加入和簡化這個查詢:

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); 
+1

+1 Simple.Data的創建者_would_最瞭解。 ;) – 2012-04-13 16:58:40

+0

@MarkRendle如何使用例如。 cast(col_abc as integer) – 2014-12-27 11:10:08

+0

@PavanJaju不幸的是,不可能。我會考慮v2。 – 2015-01-05 10:03:55

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 
+0

嗨Cory。 Simple.Data是一個使用動態類型的ORM,因此沒有以'db.TableA'開頭的代碼有任何編譯時執行,而是由Simple.Data API解釋,以便將C#內容轉換爲SQL。因此,這個問題。如果我使用「直接C#」,你的任何解決方案都可以正常工作。更多關於Simple.Data的信息[這裏](https://github.com/markrendle/Simple.Data/wiki) – EricP 2012-02-23 23:24:25

+0

@EricP:我做了一些研究並更新了答案。在引擎蓋下面,「動態」對象仍然只是對象。你應該能夠將它們與'null'進行比較。往上看。 – 2012-02-23 23:37:24

0

合併是相當無用這裏。

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

這基本上意味着,自GETDATE如果b.SomeDate爲null,則返回true()將永遠不會< = 1/1/1900。你可以用這個代替上面....

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

這可能把它簡化一點...

+0

嗨,山姆,你的策略在這種情況下工作,但它仍然不能解決如何使用simple.data中的sql函數的基本問題。有沒有辦法獎勵部分信用? :p – EricP 2012-02-23 23:34:39