2016-03-08 1 views
1

Я пытаюсь получить счет кредита по типу книги.Как создать «группу по» на имущество ребенка и избежать «NotSupportedException»

У меня есть эти 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 Entities поддерживает только листинг EDM примитивных или перечисляемых типов.

Я понимаю, почему я получаю эту ошибку, но теперь мне интересно, есть ли способ достичь того, что я хочу, только с одним запросом?

+0

@AlperTungaArslan, которым я управляю Non-polymorphic Querie, чтобы получить объекты SmallBooks. Во всяком случае, это ничего не изменит, потому что exm - это объект SmallBook в обоих случаях. –

ответ

1

Вы можете использовать Явные:

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(); 
+0

Ой! я не думал о присоединении ... Он отлично работает! Я рассмотрю использование свойства обратной навигации, но я должен быть уверен, что не получаю круговые ссылки Json/Serialization. –

0

Что-то вроде ..

var result = context.Loans.GroupBy(g=> g.book.Type).select(s=> new { BookType= s.book.type, count = s.count }).ToList(); 
+0

не будет работать, поскольку в книге нет свойства «Тип». –

Смежные вопросы