2013-07-17 12 views
5

SqlExpressionVisitor.Where句の中でEnumerable.Containsを使用してデータベースにクエリを実行しようとしています。ラムダがコンパイルされると、null参照例外が発生します。Ormlite Where-Contains Fail

foreach (Object e in inArgs)(現行1067)にSqlExpressionVisitor.VisitArrayMethodCallを入れた場合、inArgsがヌルであるため、チョークします。エラーの原因となるサンプルは、次のとおりです。私はlambdas/expressionsがなぜこれが起こっているのかを知るのに十分理解していません。

私の質問はです。私は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; } 
} 

、それがコンパイルされたメソッドがnullであることをobject[]にキャストを引き起こしint[]を返して呼び出し判明。 IEnumerableにキャストすると、私の特定の問題が修正されます。

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

これは(もしあれば)しかし持っている意味合いがどんなものなのかわからないに

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

を変更しました。まだいくつかのガイダンスを探しています。

+0

この特定の問題に関連して、[6時間前](https://github.com/ServiceStack/ServiceStack.OrmLite/commit/9f0b0e8cfa4410da5d288bf754ba6538805cbec0)についてのORMLiteリポジトリへの更新があったようです。 – Mike

答えて

2

が、それはバグだっ判明使用し、含まれています。それはcommit 9f0b0e8のおかげで@ sqlite訪問者とSQL訪問者のために修正されています@mythz。

8

代わりに使用してはSql.In

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

+0

'Sql.In'は非SQLストアでは動作しません(' List ')。私が持っている実際のコードは、パラメータとして式を取るリポジトリを呼び出すサービス層にあります。 – Chris