2013-07-17 28 views
5

Tôi đang cố gắng truy vấn db của mình bằng cách sử dụng Enumerable.Contains bên trong mệnh đề SqlExpressionVisitor.Where. Khi lambda được biên dịch, tôi nhận được một ngoại lệ tham chiếu null.Ormlite Where-Contains Fails

Khi khách truy cập truy cập vào số foreach (Object e in inArgs) (hiện tại là dòng 1067) bên trong SqlExpressionVisitor.VisitArrayMethodCall, nó sẽ tắt vì inArgs là không. Sau đây là mẫu của tôi gây ra lỗi. Tôi không hiểu lambdas/biểu thức cũng đủ để biết tại sao điều này xảy ra.

Vì vậy, câu hỏi của tôi là, tôi không sử dụng mệnh đề Where đúng cách hay đây có phải là lỗi không?

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

Sau một chút đào sâu thêm, nó quay ra gọi phương thức biên soạn được trả lại một int[] gây các diễn viên để object[] là null. Truyền tới IEnumerable khắc phục vấn đề cụ thể của tôi.

Changed

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

để

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

Không chắc những gì sắp xếp của những tác động này có dù (nếu có). Vẫn đang tìm kiếm một số hướng dẫn.

+0

Dường như có bản cập nhật cho kho lưu trữ ORMLite khoảng [6 giờ trước] (https://github.com/ServiceStack/ServiceStack.OrmLite/commit/9f0b0e8cfa4410da5d288bf754ba6538805cbec0) liên quan đến vấn đề cụ thể này. – Mike

Trả lời

2

Hóa ra đó là một lỗi. Nó đã được cố định cho khách truy cập sqlite và khách truy cập sql là commit 9f0b0e8 Cảm ơn @mythz.

8

Thay vì sử dụng Có, sử dụng Sql.In

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

+0

'Sql.In' không hoạt động trên các cửa hàng không phải sql (' Danh sách '). Mã thực tế mà tôi có nằm trong một lớp dịch vụ gọi các kho lưu trữ có một biểu thức như một tham số. – Chris

Các vấn đề liên quan