2012-05-09 12 views
6

Jestem ciekawy, jak utworzyć właściwość, którą można przetłumaczyć przez LINQ. Poniżej jest bardzo prosty przykład.Tworzenie właściwości, którą LINQ do jednostek może przetłumaczyć

Mam tabeli/klasy Category, który ma kolumnę ParentId linkami do siebie (tak, to kategoria może mieć podkategorii)

EF automatycznie generuje własność Category1, która jest kategoria nadrzędna.

Dla jasności, stworzyłem inną nieruchomość

public partial class Category 
{ 
    public Category Parent 
    { 
    get { return Category1; } 
    } 
} 

Problemem jest, to działa

var categs = ctx.Categories.Where(x => x.Category1 == null); 

ale to nie działa

var categs = ctx.Categories.Where(x => x.Parent == null); 

określony element typu "Parent" nie jest obsługiwany w LINQ do Entities. Obsługiwane są tylko inicjatory, elementy encji i właściwości nawigacji jednostki.

Czy istnieje sposób utworzenia właściwości do przetłumaczenia (LINQ do SQL) bez wykonywania funkcji .ToList()?

EDIT: chcę, aby uniknąć dotykania Model.edmx ponieważ baza danych często zmienia się w trakcie rozwoju i .edmx często musi zostać odtworzone

+0

Musisz utworzyć właściwość nawigacji z kategorii na rodzica jak klucz obcy –

+0

Cześć Zimno Powiedziałem, przepraszam Nie jestem pewien co masz na myśli. Istnieje już klucz obcy (w przeciwnym razie EF nie utworzy kategorii 1) – Aximili

+0

Czy rzeczywiście spojrzałeś na "Kategorię1" w Model.Designer.cs i/lub Reflektor, aby zobaczyć jakie atrybuty lub inne akcesoria zostały dodane do jej definicji? –

Odpowiedz

2

Jeśli zapytasz, czy możliwe jest utworzenie właściwości z dowolnym kodem C# w elementach pobierających/ustawiających, a później zrozumiesz to przez standardowy LINQ dla elementów - wtedy nie, nie można tego zrobić. C# jest znacznie bardziej wyrazisty od SQL i nieuzasadnione jest oczekiwać, że Entity Framework będzie działał jako ogólny translator języka C# do SQL.

Można obejść to wiele spraw, ale na przykład patrz: Using a partial class property inside LINQ statement.

Aktualizacja

że to pomoże, jeśli powiedziano nam, co dokładnie chcesz osiągnąć, ale oto przykład:

public partial class Category 
{ 
    public static Expression<Func<Category, bool>> ParentIsNullExpression 
    { 
     get 
     { 
      return c => c.Category1 == null; 
     } 
    } 
} 

a następnie

var categs = ctx.Categories.Where(Category.ParentIsNullExpression); 

Wszystkie rodzaje Możliwe są manipulacje na wyrażeniach, niektóre z nich są wspierane przez EF i jako takie tłumaczone na SQL.

+0

Nie można tego zrobić w języku C#? Ale sam Model.Designer.cs (plik CS dla EDMX) to C#, prawda? Czy odwołujesz się do właściwości zwracających wyrażenia z tego linku? Popatrzę na to. – Aximili

+0

Tak, miałem na myśli właściwości Expression. Kod właściwości nie sprawia, że ​​działa on w Model.Designer.cs, jest to wyrażenie używane do uzyskania dostępu do właściwości, np. '' c => c.Category''. EF wie, że chcesz mieć właściwość "Kategoria" i tłumaczy ją na kolumnę/tabelę "Kategoria". –

+0

Niestety, nigdy nie użyłem właściwości wyrażenia. Czy mówisz, że jest możliwe, że właściwość Expression zostanie przetłumaczona na SQL? Czy możesz zastąpić właściwość Parent w moim pytaniu właściwością Expression, aby LINQ mógł ją przetłumaczyć? Dzięki Jacek – Aximili

0

w projektanta Entity Data Model (.edmx pliku), można zmienić nazwę Category1 do

+0

To był bardzo uproszczony przykład. Pytałem, jak napisać właściwość, nie zmieniając nazwy istniejącej. Dzięki i tak. – Aximili

0

Masz 4 opcje: pierwsza

  • Dodaj go do projektanta EDMX
  • Dodaj swoją nieruchomość do sekcji CSDL z EDMX, dodać kolumnę do sekcji SSDL z

    1. użyć kodu EDMX, a następnie zmapuj je do siebie w sekcji mapowania EDMX.
    2. Wprowadź zapytanie do pamięci za pomocą .ToList(), a następnie użyj wewnętrznego LINQ zamiast LINQ do Encji.
  • Powiązane problemy