Tagi na forum.

Windows 14206 SQL Server 2132
sieci 6796 Windows XP 1921
SQL 6578 Outlook 1838
SBS 3868 Uprawnienia 1777
Windows 2003 2781 IIS 1636
Windows Server 2588 Office 1516
DNS 2315 Skrypt 1499

pokaż wszystkie tagi na forum

Linq to Sql i bindowanie wynikow do grida

aristo 2010-03-11 21:30:18
0
avatar
 
 
Witam serdecznie.
 
Przechodzac od razu do sedan, zalozmy ze mam dwie tabele w dbml’u:
 
Customers (ID, Name)
Orders (ID, IDCustomers)
 
IDCustomers to obcy klucz FK_Orders.IDCustomers -> Customers.ID
 
 
Teraz wykonuje zapytanie:
 
DCDataContext dc = new DCDataContext(connection);
Customer = (from r in dc.Orders
       select r).Single();
 
Nastepnie binduje query do grida.
Oczywiscie w kolumnie IDCustomers dostaje wartosc liczbowa zamiast Customers.Name.
 
Teoretycznie moge przy podlaczaniu wynikow do grida przejsc do Customers podajac cos takiego: Customer.Customers.Name tyle ze w tym przypadku Linq ponownie odpyta baze danych czego chcialem uniknac. (Podlaczanie do grida jest wykonywane w innej warstwie aplikacji i chcialbym uniknac w niej jakichkolwiek zapytan do bazy)
 
Innym pomyslem na rozwiazanie problemu bylo rozszerzenie klasy Orders o pole, powiedzmy _CustomerName i przy zapytaniu wyciagac pola recznie:
 
Customer = (from r in dc.Orders
select new {r.ID, r. Name, _CustomerName = r.Customers.Name}).Single();
 
Wtedy przy bindowaniu grida moglbym wybrac pole _CustomerNaem zamiast IDCustomers, tyle ze w tym przypadku to troche niewygodne.
 
Zastanawiam sie w jaki inny sposob moznaby rozwiazac ten problem.
 
Pewnie niejeden z was bindowal wyniki zapytania do gridow i mial podobny problem.
 
Pozdrawiam
Mariusz
tagi: LINQ
This is not war. This is pest control!


andrew_sz  2010-03-11 23:59:05 #1
0
avatar
 
 
W sumie to akurat tu nie ma znaczenia, że to jest linqtosql czy co innego.
Normalnym rozwiązaniem jest po prostu robienie joina, jednak skoro używasz wygenerowanych asocjacji to skorzystasz z nich, w sumie nie masz za dużego wyjścia, musisz to zrobić poprzez select new i dodać tę nazwę i rozszerzyć klasę lub stworzyć nową na tą potrzebę.
Ja np. nie korzystam z asocjacji (usuwam je)  i robię joiny, mi to bardziej odpowiada.

if (this.PostPomógłCi) { KliknijPomógłMi(); }
aristo  2010-03-13 09:26:56 #1.1
0
avatar
 
 
Znalazlem rozwiazanie tutaj: http://dotnetslackers.com/articles/csharp/Load-Lazy-in-LINQ-to-SQL.aspx#specify-your-fetch-plan

W skrocie: 
System.Data.Linq.DataLoadOptions.DataLoadOptions dlo = new System.Data.Linq.DataLoadOptions(); dlo.LoadWith<Orders>(c => c.Customers);dataContext.LoadOptions = dlo;

I problem z glowy :-)
PozdrawiamMariusz

This is not war. This is pest control!
andrew_sz  2010-03-13 11:28:59 #1.1.1
0
avatar
 
 
To jest tylko jedno z rozwiązań, skoro zależało Ci na tym, aby nie wykonywać dodatkowych selectów to założyłem, że masz na uwadze wydajność, używając LoadWith dla każdego zamówienia pobierzesz pełne dane klienta, a nie koniecznie każdy tak chce, bo np. wystarczy Ci tylko jego nazwa i id, aby zrobić link do jego profilu, pobieranie tylko wymaganych pól zamiast całości zawsze jest lepszym rozwiązaniem. choć dzięki LoadWith nie musisz robić nowych klas czy ich rozszerzać to trzeba pamiętać ile to kosztuje, być może dla Ciebie to nie ma znaczenia, bo masz relatywnie małe tabele, ale pomyśl gdyby klient miał w bazie 15 pól, czy wszystkie są Ci potrzebne, aby wyświetlić razem z listą zamówień lub każdym zamówieniem? Zawsze możesz zrobić też select new, ale wtedy wracasz do robienia własnych klas lub rozszerzania, koniec w końcu LoadWith nie robi nic innego jak joina o którym już pisałem poprzednio.

Edytowano 1 raz. Ostatnio 2010-03-13 11:30:02 przez andrew_sz.
if (this.PostPomógłCi) { KliknijPomógłMi(); }
aristo  2010-03-13 14:01:07 #1.1.1.1
0
avatar
 
 
Hej,
 
Pisalem o tym, ze nie chce wykonywac dodatkowych select'ow w warstwie biznesowej czy prezentacji. Pozatym to fajne rozwiazanie w relacjach typu many-one, one-one, gdzie trzeba pobrac np nazwe uzytownika z tabeli uzytkownikow zamiast jego ID z tabeli, ktora aktualnie pobieram.
 
Niemniej dzieki za pomoc.
 
Pozdrawiam
Mariusz

This is not war. This is pest control!

Udziel odpowiedzi

avatar
Treść wpisu:

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.

Idź na górę strony