14.02.2017 Views

. Стиллмен, Дж. Грин - Изучаем 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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!