我正在創建一個Entity Framework 7項目來替換Entity Framework 6項目。
我有一個屬於一個國家的Item實體。然後我有一個linq查詢,按國家/地區獲取計數。這是查詢。
var results = allItems
.GroupBy(g => g.Country)
.ToDictionary(s => s.Key, s => s.Count());
這適用於EF6但在EF 7中引發異常(例外情況在底部)。
這是我的實體:
public class Item
{
[Key]
public int id { get; set; }
[Required]
public int Countryid { get; set; }
[ForeignKey("Countryid")]
public virtual Country Country { get; set; }
}
在EF 7中,使用調試器,我看到Country是null(這是導航屬性),但我確實有countryid。在EF 6中,我有一個導航屬性的對象。另外,我使用Moq進行單元測試並且它們可以工作(顯示nav屬性)。
我試圖添加一個包含但我不應該這樣做。我不需要在EF 6或Mock中使用它。
使用include給出:
var results = allItems
.Include(i => i.Country)
.GroupBy(g => g.Country)
.ToDictionary(s => s.Key, s => s.Count());
我犯了同樣的錯誤。
這是錯誤:
類型'System.Func
2[Microsoft.Data.Entity.Query.EntityQueryModelVisitor+TransparentIdentifier
表達式2[Microsoft.Data.Entity.Query.EntityQueryModelVisitor+TransparentIdentifier
2 [Microsoft.Data.Entity.Query.EntityQueryModelVisitor + TransparentIdentifier2[FMS.DAL.Entities.ActionItem,Microsoft.Data.Entity.Storage.ValueBuffer],Microsoft.Data.Entity.Storage.ValueBuffer],FMS.DAL.Entities.MemberCountry]' cannot be used for parameter of type 'System.Func
22[FMS.DAL.Entities.ActionItem,Microsoft.Data.Entity.Storage.ValueBuffer],Microsoft.Data.Entity.Storage.ValueBuffer],FMS.DAL.Entities.MemberCountry]' cannot be used for parameter of type 'System.Func
[FMS.DAL.Entities.ActionItem,FMS.DAL.Entities .MemberCountry]'方法'System.Collections.Generic.IEnumerable1[System.Linq.IGrouping
2 [FMS.DAL.Entities.MemberCountry,FMS.DAL.Entities.ActionItem]] _GroupBy [ActionItem,MemberCountry,ActionItem](系統1[FMS.DAL.Entities.ActionItem], System.Func
2 [FMS.DAL.Entities.ActionItem,FMS.DAL.Entities.MemberCountry],System.Func`2 [FMS.DAL.Entities .ActionItem,FMS.DAL.Entities.ActionItem])'
目前GroupBy未在EF7中實現,功能狀態可在此處的路線圖頁面上找到。 https://github.com/aspnet/EntityFramework/wiki/Roadmap
解決方法是:
context.Countries.Select( x => new
{
x.Id,
Items = x.Items.Count
} ).ToDictionary( x => x.Id, x => x.Items );
public class Country
{
public int Id { get; set; }
//Add this property
public virtual ICollection<Item> Items { get; set; }
}
//Generated SQL
SELECT (
SELECT COUNT(*)
FROM [Item] AS [i]
WHERE [x].[Id] = [i].[Countryid]
), [x].[Id]
FROM [Country] AS [x]
這需要將一個Items屬性添加到country,但是可以讓你在Linq中實現你的目標。您也可以在sql中編寫查詢並使用EF執行,但可能不是最佳選擇。