2017-03-08 28 views
5

Czy jest możliwe orderby wirtualnych nieruchomości na obiekcie?Zamów wirtualną właściwość w strukturze jednostki

Mam klasy podobny do:

public int Id{get;set;} 
public string Name {get;set;} 

public virtual string TestName 
{ 
    get { return string.Format("{0}{1}", Name , Id); } 
} 

Kiedy zamówić przez właściwość TestName, pojawia się błąd:

"The specified type member 'TestName' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."

pierwotnie miał metodę w częściowej klasy, właściwość jest używany do zwracania danych, ale nie zamawiania.

Czy istnieje sposób obejścia tego?

+0

Podejrzewam, że musisz określić tylko do odczytu lub niezmapowany. – Schwarzie2478

+1

Błąd nie ma nic wspólnego z właściwością będącą 'wirtualnym'. Otrzymujesz błąd, ponieważ kolekcja, którą nazywasz 'OrderBy' jest' IQueryable 'dlatego EF próbuje utworzyć ** SQL ** z tego. Ponieważ DB nie zna tej właściwości, nie może jej zamówić. –

Odpowiedz

3

Zamiast tylko .OrderBy(x => x.TestName) należy zamiast tego użyć .ToList().OrderBy(x => x.TestName) w zapytaniu EF.

Jest tak, ponieważ właściwość TestName nie istnieje jako kolumna w tabeli bazy danych, a zapytanie nie może zostać przekonwertowane na instrukcję SQL. Wywołanie .ToList() zmaterializuje zapytanie do kolekcji C#, którą następnie można zamówić.

+0

To działałoby, ale próbuję wykonać zapytanie w dużej kolekcji tej klasy, a ToList() spowodowałoby pogorszenie wydajności –

1

Możesz użyć DelegateDecompiler, aby rozwinąć kod wewnątrz właściwości do drzewa wyrażeń, co oznacza, że ​​Linq to Entities może generować SQL z niego.

https://github.com/hazzik/DelegateDecompiler

Wystarczy ozdobić właściwość z atrybutem [Computed] i wywołać .Decompile() jako część kwerendy LINQ.