Przygody z oprogramowaniem
  • Start
  • Szkolenia
    • Szkolenia otwarte
    • Katalog szkoleń
  • Usługi
    • Konsulting
    • Mentoring
    • Research & Development
  • Blog
  • Wiedza
    • Strefa wiedzy
    • BFsharp
    • SaaS
  • Klienci
  • Kontakt
2

W czym EntityFramework jest lepsze od NHibernate?

6 August, 2012-EntityFramework, Linq, NHibernate

Tak to prawda. Ci co mnie znają, wiedzą o mojej negatywnej opinii o EF, a pozytywnej o NHibernate’ie.
Jednak ostatnio znalazłem bardzo przydatną funkcjonalność, tak naprawdę dowiedziałem się o jej braku w NHibernacie w porównaniu do EF. Otóż wyobraźmy sobie, że mamy zdefiniowaną poniższą metodę, która zwraca na IQueryable – interfejs, który pozwala na komponowanie zapytań linq i dopiero w momencie, gdy chcemy je wykonać, wszystko pakowane jest w jednego SQL i wysyłane do bazy.

public IQueryable<OrderDto> FindOrders()
{
    var dto = from o in EntityManager.CurrentSession.Query<Order>()
              select new OrderDto (o.Id, o.TotalCost, o.SubmitDate, 
                                   o.OrderStatus);

    return dto;
}

Niestety poniższy kod nie działa w NHibernacie – funkcjonalność ta nie została nadal zaimplementowana…
Tylko niektóre operatory są supportowane w tym kontekście, np. Skip i Take.

var r = from dto in finder.FindOrders()
        where dto.OrderStatus == OrderStatus.Draft
        select dto;

var result = r.ToArray();

Oczywiście w EF wszystko ładnie działa, zapytania się komponują i generują poprawne selecty.

Czytaj dalej | Dyskutuj
0

Moc Linq’u

5 December, 2011-C#, Linq

Linq to potężne narzędzie, dzięki któremu można zrobić złożone rzeczy małą ilością kodu. Oto przykład:

XDocument doc = XDocument.Load("data.xml");
var r = from page in doc.Element("prizes").Elements().AsParallel()
            .WithDegreeOfParallelism(16)
            .WithExecutionMode(ParallelExecutionMode.ForceParallelism)
        from prize in page.Elements("item")
        let points = prize.Element("points").Value
        select new Price()
        {
            Category = page.Element("header").Value
                .Substring("Nagrody w kategorii: ".Length),
            Name = prize.Element("title").Value,
            Content= prize.Element("content").Value,
            ImagePath = GetImage(prize.Element("image").Value),
            Points = Convert.ToInt32(
                points.Substring(0,points.Length-3).Replace(" ", ""))
        };

Co robi powyższe zapytanie? Otóż z pewnego xml’a wybiera ono wszystkie elementy będące nagrodami (tag item) i mapuje je na postać obiektową. Co ciekawe metoda GetImage pobiera obrazek z internetu skojarzony z nagrodą. Niestety sekwencyjne wykonanie jest stosunkowo wolne, bo jest to zewnętrzna operacja IO. Korzystając z PLinq możemy to bardzo łatwo i szybko zmienić. Wystarczy użyć extension metody AsParallel. Od tej wchili analiza, mapowanie i ściąganie obrazków odbywać się będzie rownolegle dla kilku nagród. Czy nie jest to proste?

Czytaj dalej | Dyskutuj

Kategorie

Architecture BFsharp Blog Business Framework C# CqRS DDD Debugging DSL EntityFramework Formula JavaScript Linq NHibernate SaaS Silverlight SQL Visual Studio WPF Wzorce

O mnie


RSS Feed

© macmichal.pl 2011 Wszystkie prawa zastrzeżone