Jaki jest najlepszy sposób sprawdzenia, czy obiekt istnieje w bazie danych z punktu widzenia wydajności? Używam Entity Framework 1.0 (ASP.NET 3.5 SP1).
114
Jaki jest najlepszy sposób sprawdzenia, czy obiekt istnieje w bazie danych z punktu widzenia wydajności? Używam Entity Framework 1.0 (ASP.NET 3.5 SP1).
Jeśli nie chcesz bezpośrednio wykonywać kodu SQL, najlepszym sposobem jest użycie Any () . Dzieje się tak, ponieważ Any () powróci, gdy tylko znajdzie dopasowanie. Inną opcją jest Count () , ale może to wymagać sprawdzenia każdego wiersza przed zwróceniem.
Oto przykład, jak go używać:
if (context.MyEntity.Any(o => o.Id == idToMatch))
{
// Match!
}
Oraz w vb.net
If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
' Match!
End If
T
do interfejsu, który jestIEnumerable
i zwracasz obiekty, które zawierają znakId
, powinieneś być w stanie użyć swojej funkcji ogólnejIsExists<T>()
.Z punktu widzenia wydajności wydaje mi się, że odpowiednie byłoby bezpośrednie zapytanie SQL za pomocą polecenia EXISTS . Zobacz tutaj, jak wykonać SQL bezpośrednio w Entity Framework: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework- 4.aspx
źródło
Musiałem poradzić sobie ze scenariuszem, w którym procent duplikatów dostarczanych w nowych rekordach danych był bardzo wysoki i tak wiele tysięcy wywołań bazy danych było wykonywanych w celu sprawdzenia duplikatów (więc procesor wysyłał dużo czasu na 100%). Ostatecznie postanowiłem zachować ostatnie 100 000 rekordów w pamięci podręcznej. W ten sposób mogłem sprawdzić, czy nie ma duplikatów w zapisach w pamięci podręcznej, co było niezwykle szybkie w porównaniu z zapytaniem LINQ do bazy danych SQL, a następnie zapisać wszelkie autentycznie nowe rekordy do bazy danych (a także dodać je do pamięci podręcznej danych, co również posortowane i przycięte, aby zachować odpowiednią długość).
Zwróć uwagę, że nieprzetworzone dane były plikiem CSV zawierającym wiele pojedynczych rekordów, które trzeba było przeanalizować. Rekordy w każdym kolejnym pliku (które pojawiały się w tempie około 1 na 5 minut) znacznie się pokrywały, stąd wysoki procent duplikatów.
Krótko mówiąc, jeśli napływają surowe dane ze znacznikami czasu, prawie w porządku, użycie pamięci podręcznej może pomóc w sprawdzaniu duplikacji rekordów.
źródło
Wiem, że to bardzo stary wątek, ale po prostu na wypadek, gdyby ktoś taki jak ja potrzebował tego rozwiązania, ale w VB.NET oto, czego użyłem w oparciu o powyższe odpowiedzi.
źródło
Miałem z tym problem - mój EntityKey składa się z trzech właściwości (PK z 3 kolumnami) i nie chciałem sprawdzać każdej z kolumn, ponieważ byłoby to brzydkie. Pomyślałem o rozwiązaniu, które działa cały czas ze wszystkimi podmiotami.
Innym powodem jest to, że nie lubię za każdym razem łapać UpdateExceptions.
Potrzebna jest odrobina refleksji, aby uzyskać wartości właściwości klucza.
Kod jest zaimplementowany jako rozszerzenie, aby uprościć użytkowanie, jako:
Spójrz:
źródło
Po prostu sprawdzam, czy obiekt jest pusty, u mnie działa w 100%
źródło
Dlaczego tego nie zrobisz?
źródło
Najlepszy sposób na zrobienie tego
Niezależnie od tego, jaki jest twój obiekt i dla jakiej tabeli w bazie danych, jedyne, co musisz mieć, to klucz podstawowy w obiekcie.
Kod C #
Kod VB.NET
źródło