2013-07-17 78 views
5

我試圖在SqlExpressionVisitor.Where子句中使用Enumerable.Contains查詢我的分貝。在編譯lambda時,我得到一個空引用異常。Ormlite Where-Contains Fails

當訪問者在SqlExpressionVisitor.VisitArrayMethodCall內對foreach (Object e in inArgs)(當前行1067)進行訪問時,它會因爲inArgs爲空而窒息。以下是導致錯誤的示例。我不明白lambda表達式/表達式足以知道爲什麼會發生這種情況。

所以我的問題是,我沒有正確使用Where子句或這是一個錯誤?

class Program 
{ 
    static void Main(string[] args) 
    { 
     var connectionFactory = new OrmLiteConnectionFactory(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|Database1.mdf;Integrated Security=True;User Instance=True", SqlServerDialect.Provider); 
     SetupDb(connectionFactory);   

     using (var db = connectionFactory.OpenDbConnection()) 
     { 
      var numbersToSelect = new int[2] { 1, 2 }; 
      db.Select<SomeObject>(e => e.Where(o => numbersToSelect.Contains(o.Number))); 
     } 
    } 

    static void SetupDb(IDbConnectionFactory connectionFactory) 
    { 
     using (var db = connectionFactory.OpenDbConnection()) 
     { 
      db.DropTable<SomeObject>(); 
      db.CreateTable<SomeObject>(); 
      db.Insert(new SomeObject { Number = 1 }); 
      db.Insert(new SomeObject { Number = 2 }); 
      db.Insert(new SomeObject { Number = 3 }); 
      db.Insert(new SomeObject { Number = 4 }); 
      db.Insert(new SomeObject { Number = 5 }); 
     } 
    } 
} 

class SomeObject 
{ 
    public int Number { get; set; } 
} 

多一點挖後,原來調用編譯方法返回一個int[]這將導致投地object[]爲空。施放到IEnumerable可修復我的特定問題。

改變

var getter = lambda.Compile(); 
var inArgs = getter() as object[]; 

var getter = lambda.Compile(); 
var inArgs = getter() as IEnumerable; 

不知道這有什麼樣的影響的,但(如果有的話)。仍在尋找一些指導。

+0

看起來好像[6小時前](http://hithub.com/ServiceStack/ServiceStack.OrmLite/commit/9f0b0e8cfa4410da5d288bf754ba6538805cbec0)有關於此特定問題的ORMLite存儲庫更新。 – Mike

回答

2

原來這是一個錯誤。它已被修復爲sqlite訪問者和sql訪問者作爲commit 9f0b0e8謝謝@mythz。

8

而不是使用包含使用Sql.In

db.Select<SomeObject>(e => e.Where(o => Sql.In(o.Number,numbersToSelect)));

+0

'Sql.In'不適用於非SQL存儲('List ')。我擁有的實際代碼位於服務層,它調用將表達式作爲參數的存儲庫。 – Chris