C# 如何在孩子的财产上创建“分组依据”并避免“NotSupportedException”
我试着按书的类型计算贷款的数量 我简化了这3节课。代码优先模型的一部分:C# 如何在孩子的财产上创建“分组依据”并避免“NotSupportedException”,c#,linq,linq-to-entities,entity-framework-6,C#,Linq,Linq To Entities,Entity Framework 6,我试着按书的类型计算贷款的数量 我简化了这3节课。代码优先模型的一部分: public class Loan { public int LoanId {get;set;} ..... public int BookId {get;set;} Public virtual Book {get;set;} } //Book parent class public class Book { public int
public class Loan
{
public int LoanId {get;set;}
.....
public int BookId {get;set;}
Public virtual Book {get;set;}
}
//Book parent class
public class Book {
public int BookId {get;set;}
...
}
//a Book child class with a specific 'Type' property
public SmallBook : Book
{
public string Type {get;set;}
...
}
这么长时间以来,我尝试了这种查询
var StatsMono = (from p in context.Loans
//the 'where' clause allow to obtain all the loans where Loans.Book is a SmallBook.
where context.Books.OfType<SmallBook>().Any(exm => exm.BookId == p.BookId)
//here is my problem : i can't access 'SmallBook.Type' w/o cast
group p by ((SmallBook)p.Book).Type into g
select { GroupingElement=g.Key,intValue=g.Count()}
).ToList();
…但我无法排除以下例外情况:
无法将类型“Ips.Models.Book”强制转换为类型
“Ips.Models.SmallBook”。LINQ to实体仅支持铸造EDM
基本类型或枚举类型
我理解为什么会出现这个错误,但现在我想知道是否有一种方法可以通过一个查询实现我想要的结果?类似于
var result = context.Loans.GroupBy(g=> g.book.Type).select(s=> new { BookType= s.book.type, count = s.count }).ToList();
您可以使用显式联接:
var StatsMono = (from p in db.Loans
join b in db.Books.OfType<SmallBook>() on p.BookId equals b.BookId
group p by b.Type into g
select new { GroupingElement = g.Key, intValue = g.Count() }
).ToList();
但最好将反向导航属性添加到模型中
public abstract class Book
{
public int BookId { get; set; }
// ...
public ICollection<Loan> Loans { get; set; }
}
并使用它
var StatsMono = (from b in db.Books.OfType<SmallBook>()
from p in b.Loans
group p by b.Type into g
select new { GroupingElement = g.Key, intValue = g.Count() }
).ToList();
因为Book中没有属性“Type”,所以它不起作用。@AlperTungaArslan这是我运行非多态查询以获取SmallBooks实体的方式。无论如何,它不会改变任何东西,因为exm在这两种情况下都是SmallBook实体。哎哟!我没想过加入。。。非常好用,谢谢!我将考虑使用反向导航属性,但我必须确保不会获得JSON/序列化循环引用。