Rss Feed
Tweeter button
Facebook button
Technorati button
Reddit button
Myspace button
Linkedin button
Webonews button
Delicious button
Digg button
Flickr button
Stumbleupon button
Newsvine button
Youtube button
 

Linq to Entities და T-SQL

Filed Under (პროგრამირება, მონაც. ბაზები) by on 07-04-2010

Tagged Under : , , , , ,

linq


აქ მოვიყვან რამოდენიმე საჭირო მაგალითს Linq to Entities და თუ როგორ გამოიყურება ის T-SQL-ში.
Linq to Entities ძალიან გავს Linq to SQL-ს, ამიტომ ვისაც Linq to SQL-ის მაგალითები აინტერესებს მათაც გამოადგებათ. ქვარები C#-ზეა თუმცა ვინც VB-ზე მუშაობს წაკითხვა არ გაუჭირდება.

ასევე Entity Framework-ი დაახლოებით მსგავს, ან ზოგ შემთხვევაში იგივე T-SQL-ს აგენერირებს რომლებსაც მოვიყვან, თუმცა ესენი ჩემი დაწერილია. დაინტერესების შემთხვევაში SQL Profiler-ის სკრინშოტებსაც დავდებ – თუ რას აგენერირებს და აგზავნის ბაზასთან EF-ი. ქვემოთ მოყვანილი მაგალითები ამოღებული მაქ რეალური პროექტიდან რომელსაც ეს ესაა ვამთავრებ, ზოგი ქვარი შევკვეცე და გავამარტივე რომ ადვილი წასაკითხი იყოს.


where
ქვარი: ყველა შეკვეთა 2010 წელში.
Linq to Entities:

  var query = from o in _context.Orders
                  where o.OrderDate.Year == 2010
                  select o;



იგივე T-SQL-ში:
select *
from Orders
where YEAR(Orders.OrderDate)=2010




Grouping, Aggregation და Projection
ქვარი: 2010 წელში თითოეულ თვეში რამდენი იყო შეკვეთების ფასის ჯამი. თვე და ფასის ჯამი.
Linq to Entities:

var query = from o in context.Orders
                  where o.OrderDate.Year == 2010
                  group o by o.OrderDate.Month into gr
                  select new
                  {
                    Month = gr.Key,
                    Price = gr.Sum(i => i.Price)
                  };



იგივე T-SQL-ში:
select MONTH(Orders.OrderDate), SUM(Orders.Price)
from Orders
where YEAR(Orders.OrderDate)=2010
group by MONTH(Orders.OrderDate)



Grouping-ი რამოდენიმე სვეტით. ასევე როდესაც რომელიმე სვეტი NULL-ს აბრუნებს პროჯექშენში
ქვარი: მომხმარებლის სახელი+გვარი და რამდენი შეკვეთა აქვს სულ. ვისაც არ აქვს შეკვეთა იმეებს არ აბრუნებს.
Linq to Entities:

var query = from o in context.Orders
      group o by new { o.Customer.FirstName, o.Customer.LastName } into gr
      select new
      {
        Customer = gr.Key.FirstName + " " +
        (gr.Key.LastName == null ? "" : gr.Key.LastName),
        OrdersCount = gr.Count()
      };

კოდი მივწიე მარცხნივ და ცოტა დავაფორმატე რომ დატეულიყო.


იგივე T-SQL-ში (საინტერესოა case ოპერატორი):
select (Customers.FirstName + ‘ ‘ +(case when Customers.LastName IS NULL thenelse Customers.LastName end)), COUNT(Orders.ID)
from Customers inner join Orders on Customers.ID = Orders.Customer_ID
group by Customers.FirstName,Customers.LastName
—–
FirstName +-ის მერე წერია თითო ბრჭყალი, შუაში ერთი გამოტოვებით. რატომღაც არ ჩანს აქ. ასევე NULL then-ის შემდეგ წერია ცარიელი ჩარი.


ზემოთ case ოპერატორის გარეშე რომ დაგვეწერა select-ი, თუ მომხმარებლის გვარში null ეწერებოდა მაშინ FirstName + LastName დააბრუნებდა null-ს (გააჩნია მოდელი როგორი გაქვთ, ჩემი მოდელი უშვებს გვარში null-ს, სახელი კი აუცილებელი ველია. პრაქტიკისთვის საინტერესო მაგალითია).



where, group by, order by და projection
ქვარი: აპრილის თვეში, რიცხვი და ამ რიცხვში გაფორმებული შეკვეთების ფასის ჯამი. სორტირება ხდება რიცხვის მიხედვით, ზრდადობით. (როდესაც არ უთითებ ზრდადობას ან კლებადობას default არის ზრდადობა. მითითება ხდება ამ მაგალითისთვის მაგ: orderby gr.Key ascending, ან descending keyword-ებით)
Linq to Entities:

var query = from o in context.Orders
                  where o.OrderDate.Month == 4
                  group o by o.OrderDate.Day into gr
                  orderby gr.Key
                  select new
                  {
                    Day = gr.Key,
                    Total = gr.Sum(a => a.Price)
                  };

ზედა ქვარიზე SQL Profiler-ის სრკინშოტი.


იგივე T-SQL-ში:
select DAY(Orders.OrderDate), SUM(Orders.Price)
from Orders
where MONTH(Orders.OrderDate)=4
group by DAY(Orders.OrderDate)
order by DAY(Orders.OrderDate)




join (თუმცა იშვიათად ეს გამოიყენოთ linq to entitie-ში).
ქვარი: მომხმარებლის სახელი და ყველა მისი შეკვეთის თარიღი.
Linq to Entities:

var q = from c in context.Customers
              join o in context.Orders
              on c equals o.Customer
              select new
              {
                Cust = c.FirstName,
                OrderDate = o.OrderDate
              };



იგივე T-SQL-ში:
select Customers.Firstname, Orders.OrderDate
from Customers inner join Orders on Customers.ID = Orders.Customer_ID



Linq to Entities-ით დინამიური ქვარების გაკეთება არ შეიძლება. დინამიური ქვარებისთვის Entity SQL-ი გამოიყენეთ. თუმცა Entity SQL-ით იგივე ქვარების დაწერა შეიძლება რაც Linq to Entities-ით, გააჩნია როგორი ქვარია იმის მიხედვით ირჩევ რომელი გამოიყენო.


Comments:

One Response to “Linq to Entities და T-SQL”


  1. და კიდევ სხვა დანარჩენისთვის მასტერკარდი არსებობს 😀

    Like or Dislike: Thumb up 0 Thumb down 0 (0)

Leave a Reply

You must be logged in to post a comment.