Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在孩子的财产上创建“分组依据”并避免“NotSupportedException”_C#_Linq_Linq To Entities_Entity Framework 6 - Fatal编程技术网

C# 如何在孩子的财产上创建“分组依据”并避免“NotSupportedException”

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

我试着按书的类型计算贷款的数量

我简化了这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 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/序列化循环引用。