2009-03-03 10 views
6

Używam struktury encji .NET i mam jedną jednostkę zawierającą varbinary. Czy istnieje prosty sposób na uzyskanie rozmiaru varbinary w codebehind, po tym, jak został pobrany z bazy danych?Framework jednostek i VARBINARY

Myślę, że może istnieć jakiś sposób na uzyskanie rozmiaru bezpośrednio z obiektu, coś jak entity.Context.Size - lub czy trzeba obsługiwać go inaczej?

Odpowiedz

17

varbinary przekłada się na byte [] pola w ramach podmiotu, który oznacza, że ​​można sprawdzić właściwość długość tablicy:

int fieldSize = entity.MyVarBinaryField.Length; 

Jak wspomniano przez tster: W LINQ podmiotom zapytania, ty można wywołać metodę DataLength klasy SqlFunctions, która zostanie przetłumaczona na wywołanie funkcji DATALENGTH w wygenerowanej instrukcji SQL. To działa tylko z SQL Server i Entity Framework 4 lub nowszym:

int? fieldSize = repository.Entity 
    .Select(e => SqlFunctions.DataLength(e.MyVarBinaryField)).Single(); 
+1

tylko trochę heads-up, to nie zadziała Wewnątrz zapytanie (zgodnie z EF 4.0). Daje komunikat o błędzie: Typ węzła wyrażeń LINQ "ArrayLength" nie jest obsługiwany w LINQ do Entities. –

+0

Nie jestem pewien, czy to działało nawet w zapytaniu w EF 1. Marcus L. wyraźnie zapytał, jak uzyskać rozmiar varbinary po jego pobraniu z bazy danych, w takim przypadku powyższe działa dobrze. Jeśli potrzebny jest tylko rozmiar, a nie same dane binarne, zaleciłbym przechowywanie rozmiaru w osobnym polu lub uruchamianie oddzielnej kwerendy przy użyciu funkcji DATALENGTH, ponieważ Marcus skończył. W każdym razie, dzięki za heads-up :) – bernhof

+0

Zaktualizowałem odpowiedź, aby dołączyć przykład pobrania długości danych w kwerendzie LINQ do Entities (tylko EF 4). – bernhof

0

Rozwiązałem go, uruchamiając kolejne zapytanie, uzyskując DATALENGTH() komórki. Nie jest to najłagodniejszy sposób, ale działa.

W dalszym ciągu interesuje mnie, czy ktoś może znaleźć odpowiedź na to pytanie.

9

Wiem, że to pytanie jest stary, ale EF obsługuje to teraz przy użyciu SqlFunctions.DataLength()

+0

Widziałem to w MSDN, ale nie wiem, jak zaimplementować. Czy mógłbyś podać przykład? – pseudocoder

+0

Nieważne, szukałem tylko w niewłaściwym obszarze nazw. Zauważ, że pełna nazwa to 'System.Data.Objects.SqlClient.SqlFunctions.DataLength()' – pseudocoder