. Стиллмен, Дж. Грин - Изучаем C#, 2-е издание
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
я так и н<strong>е</strong> понял, как работа<strong>е</strong>т прилож<strong>е</strong>ни<strong>е</strong><br />
join.<br />
г ; Пр<strong>е</strong>длож<strong>е</strong>ни<strong>е</strong> j o i n работа<strong>е</strong>т с<br />
двумя посл<strong>е</strong>доват<strong>е</strong>льностями. Пр<strong>е</strong>дположим,<br />
у вас <strong>е</strong>сть колл<strong>е</strong>кция футбольных<br />
игроков p layers. Е<strong>е</strong> эл<strong>е</strong>м<strong>е</strong>нтами<br />
являются объ<strong>е</strong>кты со свойствами Name,<br />
P o s i t i o n и Number. Выбрать<br />
игроков, на футболк<strong>е</strong> которых ном<strong>е</strong>р<br />
больш<strong>е</strong> 10, можно запросом:<br />
v a r r e s u l t s =<br />
f r o m p l a y e r in p l a y e r s<br />
w h e r e p l a y e r . N u m b e r > 10<br />
s e l e c t p l a y e r ;<br />
У нас <strong>е</strong>сть и колл<strong>е</strong>кция j erseys,<br />
эл<strong>е</strong>м<strong>е</strong>нты которой обладают свойствами<br />
N u m b e r и Size. Чтобы опр<strong>е</strong>д<strong>е</strong>лить<br />
разм<strong>е</strong>р футболки каждого игрока запиш<strong>е</strong>м:<br />
v a r r e s u l t s =<br />
f r o m p l a y e r in p l a y e r s<br />
w h e r e p l a y e r . N u m b e r > 10<br />
j o i n s h i r t in j e r s e y s<br />
o n p l a y e r . N u m b e r<br />
e q u a l s s h i r t . N u m b e r<br />
s e l e c t shirt;<br />
Этот запрос даст мн<strong>е</strong> множ<strong>е</strong>ство<br />
( )утболок. А как быть, <strong>е</strong>сли м<strong>е</strong>ня н<strong>е</strong><br />
волнуют ном<strong>е</strong>ра игроков, но хот<strong>е</strong>лось<br />
бы узнать разм<strong>е</strong>р футболки каждого<br />
из них?<br />
^ ; Зд<strong>е</strong>сь вам пригодятся анонимны<strong>е</strong><br />
типы — в них можно положить любы<strong>е</strong><br />
нужны<strong>е</strong> вам данны<strong>е</strong>. Они позволяют и выбирать<br />
из объ<strong>е</strong>дин<strong>е</strong>нных колл<strong>е</strong>кций.<br />
Ч а с в д о<br />
ЧаДаБа<strong>е</strong>Мы<strong>е</strong><br />
Б о ї ї р о с ь і<br />
И ничто н<strong>е</strong> м<strong>е</strong>ша<strong>е</strong>т вам выбрать только<br />
им<strong>е</strong>на игроков и разм<strong>е</strong>ры их футболок:<br />
v a r r e s u l t s =<br />
f r o m p l a y e r in p l a y e r s<br />
w h e r e p l a y e r . N u m b e r > 10<br />
j o i n s h i r t in j e r s e y s<br />
o n p l a y e r . N u m b e r<br />
e q u a l s s h i r t . N u m b e r<br />
s e l e c t new {<br />
p l a y e r . N a m e ,<br />
} ;<br />
s h i r t .S i z e<br />
ИСР в состоянии самостоят<strong>е</strong>льно разобраться<br />
с р<strong>е</strong>зультатом, который выда<strong>е</strong>т<br />
запрос. При создании цикла, нум<strong>е</strong>рующ<strong>е</strong>го<br />
р<strong>е</strong>зультаты, сразу посл<strong>е</strong> ввода п<strong>е</strong>р<strong>е</strong>м<strong>е</strong>нной<br />
появится окно IntelliSense со списком.<br />
f o r e a c h (var г in r e s u l t s )<br />
г .<br />
I<br />
Equals<br />
GetType<br />
Ш Size<br />
ToString<br />
GetHashCode<br />
В списк<strong>е</strong> присутствуют свойства N a m e<br />
и Size. Добавл<strong>е</strong>нны<strong>е</strong> к пр<strong>е</strong>длож<strong>е</strong>нию<br />
s e l e c t дополнит<strong>е</strong>льны<strong>е</strong> пункты тож<strong>е</strong><br />
появятся в этом списк<strong>е</strong>. Это связано с т<strong>е</strong>м,<br />
что запрос созда<strong>е</strong>т различны<strong>е</strong> анонимны<strong>е</strong><br />
типы для различных чл<strong>е</strong>нов.<br />
Вс<strong>е</strong>гда ли нужно добавлять файл<br />
. dbm l, создава<strong>е</strong>мый программой<br />
S q I M e t a l . <strong>е</strong> х <strong>е</strong> ? Я так и н<strong>е</strong> понял,<br />
зач<strong>е</strong>м он нуж<strong>е</strong>н.<br />
:Если вы собира<strong>е</strong>т<strong>е</strong>сь писать запросы<br />
коазк Ваз<strong>е</strong> данных SQL, б<strong>е</strong>з этого файла н<strong>е</strong><br />
обойтись.<br />
Помнит<strong>е</strong>, что LINQ тр<strong>е</strong>бу<strong>е</strong>т от объ<strong>е</strong>ктов<br />
р<strong>е</strong>ализации инт<strong>е</strong>рф<strong>е</strong>йса<br />
I E n u m e r a b l e < T > . Базы SQL н<strong>е</strong> р<strong>е</strong>ализуют<br />
вообщ<strong>е</strong> никаких инт<strong>е</strong>рф<strong>е</strong>йсов, так<br />
как н<strong>е</strong> относятся к объ<strong>е</strong>ктам. Поэтому для<br />
запросов LINQ источник данных тр<strong>е</strong>бу<strong>е</strong>тся<br />
пр<strong>е</strong>образовать в объ<strong>е</strong>кт.<br />
В<strong>е</strong>рнит<strong>е</strong>сь к только что написанному<br />
коду, щ<strong>е</strong>лкнит<strong>е</strong> правой кнопкой мыши на<br />
объ<strong>е</strong>кт<strong>е</strong> People и выб<strong>е</strong>рит<strong>е</strong> команду Go<br />
to Definition. Это прив<strong>е</strong>д<strong>е</strong>т вас к м<strong>е</strong>тоду<br />
доступа C o n t a c t D B .d e s i g n e r .<br />
cs, возвращающ<strong>е</strong>му объ<strong>е</strong>кт<br />
Т а Ь 1 <strong>е</strong> < Р <strong>е</strong> о р 1 <strong>е</strong> > . Повторит<strong>е</strong> проц<strong>е</strong>дуру<br />
для объ<strong>е</strong>кта Table. Вы увидит<strong>е</strong>, что класс<br />
T a b l e < T E n t i t y > расширя<strong>е</strong>т инт<strong>е</strong>рф<strong>е</strong>йс<br />
I Q u e r y a b l e < T E n t i t y > .<br />
П<strong>е</strong>р<strong>е</strong>йдя к опр<strong>е</strong>д<strong>е</strong>л<strong>е</strong>нию этого инт<strong>е</strong>рф<strong>е</strong>йса,<br />
вы обнаружит<strong>е</strong>, что он р<strong>е</strong>ализу<strong>е</strong>т инт<strong>е</strong>рф<strong>е</strong>йс<br />
I E n u m e r a b l e < T > .<br />
То <strong>е</strong>сть файл . d b m l (и создава<strong>е</strong>мый<br />
им файл кпасса .cs) об<strong>е</strong>сп<strong>е</strong>чива<strong>е</strong>т нас<br />
объ<strong>е</strong>кгом, р<strong>е</strong>ализующим инт<strong>е</strong>рф<strong>е</strong>йс<br />
l E n u m e r a b l e . ИСР точно зна<strong>е</strong>т, как<br />
поступать с файлом . dbml: ст<strong>е</strong>н<strong>е</strong>рировав<br />
<strong>е</strong>го, добавив к про<strong>е</strong>кту и отфыв в конструктор<strong>е</strong><br />
Object Relational, вы увидит<strong>е</strong> чл<strong>е</strong>ны<br />
класса People, совпадающи<strong>е</strong> с таблиц<strong>е</strong>й<br />
P e o p l e в баз<strong>е</strong> данных. Этот класс присо<strong>е</strong>диня<strong>е</strong>тся<br />
к SQL, автоматич<strong>е</strong>ски чита<strong>е</strong>т<br />
данны<strong>е</strong> из таблиц и пр<strong>е</strong>образу<strong>е</strong>т их в форму,<br />
доступную для запросов LINQ.<br />
Пр<strong>е</strong>длож<strong>е</strong>ни<strong>е</strong> select new позволя<strong>е</strong>т конструировать пользоват<strong>е</strong>льский<br />
запрос LINQ,, в р<strong>е</strong>зультаты которого включ<strong>е</strong>ны толь<br />
ко нужны<strong>е</strong> вам эл<strong>е</strong>м<strong>е</strong>нты.<br />
дальш<strong>е</strong> > 693