2012-10-02 18 views
7

Niedawno rozpocząłem pracę z ServiceStack i jego strukturą ORMLite. Szukałem w Google i przeglądałem kod źródłowy, ale nie mogłem znaleźć niczego odpowiedniego.ServiceNack ORMLite - Wybierz kolumny

Czy istnieje sposób wybrania konkretnych kolumn podczas wykonywania zapytania z ORMLite? Coś w tym stylu: Db.First<Model>(q => q.Id == someId, "Column1, Column2")

O ile nie przegapiłem tej funkcji, jestem zaskoczony, że nikt wcześniej o to nie pytał, ponieważ jest to jedna z zasad kciuków, aby zoptymalizować transakcje DB.

+0

Cześć cobolstinks, i dziękuję za odpowiedź. Myślę, że mówisz o wersji Java, która ma działać na urządzeniach mobilnych. W rzeczywistości odwołuję się do struktury ServiceStack.ORMLite, która jest portem C# przeznaczonym do użycia w aplikacjach ASP.Net – Alexis

+0

yeap my bad, miałem na myśli ormlite i używałem go z ADK. Usunąłem mój oryginalny komentarz. – cobolstinks

Odpowiedz

7

Jeśli chcesz określić kolumny innych, że tabela trzeba użyć SQL jako seen in this earlier example

Więc w twoim przypadku można zrobić coś takiego:

Db.First<Model>("SELECT Column1, Column2 FROM AnyTableOrView"); 

Można również tworzyć częściowy model, który wygląda na stole przez zdobiące ją z atrybutem [Alias], jak:

[Alias("AnyTableOrView")] 
public class Model { 
    public int Id { get; set; } 
    public string Column1 { get; set; } 
    public string Column2 { get; set; } 
} 

Następnie można zrobić coś takiego:

Db.First<Model>(q => q.Id == someId); 

I będzie tylko SELECT + wypełnianie pól z modelu cząstkowego.

+0

Użyłem pierwszego opisanego sposobu, ale twoje drugie podejście jest o wiele czystsze. Dzięki i utrzymuj dobrą pracę. – Alexis

+0

np. I dziękuję :) – mythz

+0

Na wszelki wypadek, jeśli ktoś się zastanowi, jeśli użyjesz aliasu do atrybutu Id, musisz go również wypisać w uproszczonym modelu używanym do odpytywania. – Alexis

2

Próbowałem to:

  1. Utworzony widoku bazy danych (nazwa tabeli i kolumny są już ustawione)
  2. utworzono klasę o nazwie „Event” i pasujących do każdego pola dla tej tabeli z właściwością (użyłem [Alias] do nazwy tabeli i na wszystkich kolumnach mieć ładne imiona)
  3. Wrote dostęp do DB, aby wybrać 1 rekordów na podstawie to ID

    var dbFactory = new OrmLiteConnectionFactory(
         "Data Source=MyDB;User Id=user;Password=pwd", // Connection String 
         OracleDialect.Provider); 
    
        using (var db = dbFactory.OpenDbConnection()) 
        { 
          var event = db.GetByIdOrDefault<Event>(request.Id); 
        } 
    

W tym miejscu "zdarzenie" var jest wypełniane, ale wypełniane jest tylko pole identyfikatora! wszystkie pozostałe pola tej klasy nie są wypełnione (podczas gdy w bazie danych znajdują się rzeczywiście dane).

To najprostszy, jaki mogę zrobić i nie działa. Jakieś pomysły ? (PS: używam OrmLite dla Oracle)

Dzięki

1

znalazłem problem. Było to spowodowane niepoprawnym dopasowaniem typu między polem w mojej klasie (zdefiniowanym jako ciąg) i odpowiednim polem Oracle (czyli DATE).

Zastąpiłem ciąg datetime i działał jak charm.

Działa to doskonale dzięki WIDOKowi i to WIELKI upraszcza kod.

1

Miałem podobny problem, jednak moje rozwiązanie było inne.

Posiadałem własność typu int w moim POCO. Moje zapytanie (z Oracle) zwracało wartość zerową dla tej właściwości. Wywołało to wyjątek i uniemożliwiło dalsze przetwarzanie tego wiersza. Wynikiem było częściowe wypełnienie POCO.

Rozwiązaniem było zmienić na typ, aby można było null.

public int? mypropperty 
Powiązane problemy