Entity - wiązanie

0

Witam.

Mam trzy tabele (sytuacja zastana i taka musi zostać):

towar
id
nazwa

cecha
id
nazwa

towarCecha
idTowar
idCecha

towar - przechowuje informacje o towarach m. in. nazwę
cecha - słownik cech
towarCecha- tabela łącząca towar z cechami (jeden towar ,może mieć wiele cech)

Ktoś wymyślił, że posegreguje sobie cechy i mam na przykład:
R-meska
R-damska
D-na zamowienie
D-od reki
z umownym założeniem, że towar będzie miał tylko jedną cechę z danej grupy.

Pytanie:
Czy w Entity Framework da się zrobić takie wiązanie aby np. cechy z przedrostkiem R_ były osobną klasą tak żebym mógł traktować to jako osobną kolumnę?

Pisząc zapytanie ręcznie robię coś w tym stylu:

SELECT t.nazwa [nazwa], rc.nazwa [rodzaj], dc.nazwa [dostepnosc]
FROM towar t
LEFT JOIN towarCecha rct ON t.id = rct.idTowar AND rct.idCecha IN (SELECT id FROM cecha c WHERE c.nazwa LIKE 'R-%')
LEFT JOIN cecha rc ON rct.idCecha = rc.id
LEFT JOIN towarCecha dct ON t.id = dct.idTowar AND dct.idCecha IN (SELECT id FROM cecha c WHERE c.nazwa LIKE 'D-%')
LEFT JOIN cecha dc ON dct.idCecha = dc.id

http://www.sqlfiddle.com/#!18/2b8bf/1

0

Ale chodzi Ci o zapytanie?
ja bym zrobił tak w EF. Towar ma listę cech, a cecha listę towarów

public class Towar
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Cecha> Cechy = new HashSet<Cecha>();
    }

    public class Cecha
    {
        public int Id { get; set; }
        public string Nazwa { get; set; }
        public ICollection<Towar> Towary = new HashSet<Towar>();
    }

a zapytanie masz takie:

var result=towary  // to jest lista zaciągnięta z bazy
                .Select(t => new
                {
                    name = t.Name,
                    rodzaj = t.Cechy.Where(d => d.Nazwa.StartsWith("R-")).FirstOrDefault().Nazwa,
                    dostepnosc = t.Cechy.Where(d => d.Nazwa.StartsWith("D-")).FirstOrDefault().Nazwa
                })
                .ToList();

I efekt jest ten sam.
Tylko przy pobraniu listy towarów musisz zaincludować listę cech.

Tutaj zrobiłem akurat w select obiekt anonimowy ale możesz tam dać jakiś swój typ zgodny z wynikową tabelą

0

Dzięki, spróbuję :)

Nie wiem jeszcze jak "zaincludować listę cech", ale poszukam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1