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.
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