2016-08-25 121 views
1

我使用Entity Framework 6.0.0.0,方法是Database First。 我有三個表Client,Account,Doc。一個Client有許多DocsAccounts。關係是一對多Client表:爲什麼Entity Framewok方法「.AsEnumerable()」不返回任何內容?

public partial class Client 
{ 
    public Client() 
    { 
     this.Account = new HashSet<Account>(); 
     this.Doc = new HashSet<Doc>(); 
    } 

    public int ClientId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Account> Account { get; set; } 
    public virtual ICollection<Doc> Doc { get; set; } 
} 

AngularJs代碼片段從WebApi取數據:

angular.module("app", []).controller("searchController", function ($scope, $http) { 

    //Used to get and display the data 
    $http.get('/api/Search/').success(function (data) { 
     debugger; 
     $scope.searchs = data; 
     $scope.loading = false; 
    }) 
    .error(function() { 
     debugger; 
     $scope.error = "An Error has occured while loading posts!"; 
     $scope.loading = false; 
    }); 
} 

方法Web APIGet取數據(它沒有返回值沒有客戶。):

[HttpGet] 
    public IEnumerable<Client> Get() 
    { 
     private ClientDBEntities db = new ClientDBEntities(); 
     retutn db.Client.AsEnumerable();// it returns NOTHING. There is no clients 

    } 

然而,$http.get('/api/Search/').success(function (data)調用,如果我改變這種方法返回IEnumerable<string>

[HttpGet] 
    public IEnumerable<Client> Get() 
    { 
     List<string> list = new List<string>(){"1", "2", "3"}; 
     return list;    
    } 

我的問題是爲什麼db.Client.AsEnumerable()返回什麼?我試圖將此代碼更改爲:

retutn db.Client.ToList();// it returns all necessary data 

然而,AngularJS方法調用$http.get('/api/Search/').error(...)

任何幫助將不勝感激。

我在Watch窗口Visual Studio看到了什麼: enter image description here

+0

你得到的錯誤是什麼? –

+0

@AmitKumarGhosh沒有錯誤,只是它的工作原理都可以。我附上了我的觀察窗口,以查看我在每個查詢中得到的結果。謝謝。 – StepUp

+0

在我看來你正試圖返回數據庫對象與延遲加載。當反序列化爲json時,如果有循環引用,這可能會導致內存不足異常。 –

回答

1

,而不是看起來對我來說有一個錯誤的序列化對象爲XML或json。 這通常是由數據對象中的循環引用引起的。例如,您的客戶引用帳戶和帳戶引用客戶端。如果是這種情況,串行器將保持序列化對象,直到它耗盡內存

要解決這個問題,有幾個選項。

  1. 只通過將其轉換爲新對象(viewmodel)來返回您真正需要的數據。
  2. 爲您的查詢禁用延遲加載,這將阻止您爲該查詢加載帳戶/文檔對象,請參閱(Entity Framework: How to disable lazy loading for specific query?)。
  3. 使序列化程序忽略導致自引用循環的屬性。 (用於序列化爲json使用屬性[JsonIgnore])
0

你能嘗試匹配與List數據類型函數的返回值?

例如:

[HttpGet] 
public List<Client> Get() 
{ 
    private ClientDBEntities db = new ClientDBEntities(); 
    retutn db.Client.ToList(); 
} 

更新 這裏是一個有用的鏈接:What's the difference(s) between .ToList(), .AsEnumerable(), AsQueryable()?

基本上,有關該案件的關鍵部分是這樣的:

ToList - 這將IEnumerable轉換爲列表 - 爲此目的也經常使用 。使用AsEnumerable與 ToList的優點是AsEnumerable不執行查詢。 AsEnumerable 保留延遲執行並且不會構建一個通常無用的中間列表 。

另一方面,當需要強制執行LINQ查詢時,ToList可以成爲一種方法。

AsQueryable可用於使可枚舉集合在LINQ語句中接受 表達式。詳情請看這裏。

這也許可以解釋爲什麼你會得到一個錯誤,認爲堅持名單,或嘗試AsQueryable(),看其是否正常工作的AsEnumerable()

+0

yeap,我試過了。但是,調用'http http.get('/ api/Search /')。error(...)'。但是我想''http.get('/ api/Search /')。success(function(data){}'被調用,謝謝你的試用 – StepUp

+0

你可以驗證你的'ClientDBEntities()'確實返回什麼?也許你可以顯示該函數的代碼來幫助我理解這個問題。 –

+0

請查看我附加的圖像問題。 – StepUp

相關問題