2017-01-03 96 views
1

我試圖與EF此查詢工作,但它拋出一個異常:NotSupportedException異常:LINQ到實體無法識別方法

var c = ac.Communities.OrderBy(o => o.Posts.Count()) 
     .Skip(page*limit) 
     .Take(limit) 
     .Select(o => o.ToViewModel()).ToArray(); 

Community模型ToViewModel()方法是這樣的:

public CommunityModel ToViewModel() 
{ 
    return new CommunityModel() 
    { 
     category = Category.Name, 
     created = CreationTime, 
     description = Description, 
     id = Id, 
     name = Name, 
     ownerId = Owner.Id, 
     postsCount = Posts.Count(), 
     score = Posts.Sum(o => o.Likes - o.Unlikes), 
     shortDescription = ShortDescription, 
     subscribersCount = Subscribers.Count(), 
    }; 
} 

我在做什麼錯?

+0

爲了排除你的'ToViewModel'方法,彈出一個'.ToList()'在前面的'選擇',看看你是否仍然存在這個問題。 – Stuart

+0

@Stuart工作,謝謝!所以,基本上,'List'不再是'IQueryable',因此它不會將它轉換爲數據庫的SQL查詢,對吧?這意味着它在內存中完成所有工作,將'Community'類視爲實際對象,而不是實體對象,對嗎? – Reynevan

+0

這是正確的,你在強制使用'ToList'的時候'IQueryable'的枚舉,那麼後面的Linq方法正在處理內存集合,並且不必擔心轉換爲SQL – Stuart

回答

2

實體框架不能轉換您正在使用內ToViewModel方法。使用ToList()熱切加載結果,然後映射那些代替,避免了需要EF嘗試翻譯的SQL:

var c = ac.Communities.OrderBy(o => o.Posts.Count()) 
    .Skip(page*limit) 
    .Take(limit) 
    .ToList() 
    .Select(o => o.ToViewModel()).ToArray(); 
1

這是因爲LINQ to Entities,試圖將.ToViewModel轉換爲SQL查詢,這是轉換器無法識別的。

如果.Take沒有返回很多結果,那麼最好的解決辦法是將IQueryable更改爲List,方法是將其更改爲以下內容。

var c = ac.Communities.OrderBy(o => o.Posts.Count()) 
     .Skip(page*limit) 
     .Take(limit) 
     .ToArray() // This will return a Community array 
     .Select(o => o.ToViewModel()) // This is a IEnumerable<CommunityModel> 
     .ToArray(); // This will cast // This is a cast for Community array 
+0

是的,這就是我會用什麼。謝謝。只是出於好奇,儘管: 接受 這是因爲LINQ to Entities,嘗試將.ToViewModel轉換爲SQL查詢,這是轉換器無法識別的。 如果沒有很多結果被.Take返回,那麼您的最佳解決方案將通過將IQueryable更改爲List來將其轉換爲以下....否則...? – Reynevan

相關問題