我試圖在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;
不知道這有什麼樣的影響的,但(如果有的話)。仍在尋找一些指導。
看起來好像[6小時前](http://hithub.com/ServiceStack/ServiceStack.OrmLite/commit/9f0b0e8cfa4410da5d288bf754ba6538805cbec0)有關於此特定問題的ORMLite存儲庫更新。 – Mike