2016-04-10 33 views
3

我傳遞一個整數數組來如模型組成的API端點:實體框架傳遞整數數組到端點

public class SomeModel { 
    public IList<int> ints { get; set; } 
} 

我的終點命中是:

Get["/myobjects/{id:int}"] = _ => 
{ 
    var ints = this.Bind<SomeModel>(); 
    return myService.someMethod1((int)_.id, ints.Ints)); 
}; 

然後,當我想查詢DB中的對象時,我使用實體框架作爲ORM。

無法創建類型爲'System.Collections.Generic.IList`1 [[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral]]'的空常數值。

或者我得到:

無法比擬的類型元素 'System.Collections.Generic.IList`1 [System.Int32,mscorlib程序,版本= 4.0.0.0,文化=中性]' 。只支持原始類型,枚舉類型和實體類型。

在此上下文中僅支持實體類型,枚舉類型或基元類型。

該異常狀態,它不能創建一個空常量值,但我填充進來的數組 - 所以我不明白爲什麼它會拋出此錯誤。

編輯:整數的數組沒有被綁定和列表爲空。有誰知道如何正確綁定到列表?

+0

這不是一個EntityFramework問題,現在你已經發現你的'ints'對象沒有被正確綁定。您還應該使用MVC Next(或任何MVC 6標記)進行標記,因爲綁定在新版本中不同。 – krillgar

回答

6

請記住,所有檢查你在lamdba中做的檢查是查詢這意味着EF很可能會嘗試將它們評估爲SQL。

但是你正在檢查的是一個變量,它不是查詢的一部分。當這種情況發生時,您需要在查詢之外拆分檢查爲空的檢查。

var query = context.ReadOnly<SomeModel>().Query(x => x.myId == id); 
if (ints != null) { 
    query = query.Where(x => ints.Contains(x.SomeModelId); 
} 
var count = query.Select(x => x.Id).Count(); 

如果我深知業務情況下,如果ints爲空,整個查詢將評估爲false,所以你很可能會滿足於只檢查是否ints爲空 - >如果爲true,則計數爲零。否則 - 查詢數據庫。

var count = 0; 
if (ints != null) 
{ 
    count = context.ReadOnly<SomeModel>() 
       .Query(x => x.myId == id && 
        ints.Contains(x.SomeModelId)) 
       .Select(x => x.Id) 
       .Count(); 
} 
+0

謝謝,幫助我發現了一個錯誤,即列表基本上爲空。我編輯了描述。 – HImynameis