2013-06-20 15 views
6

Korzystanie z Entity Framework 5 jest możliwe używanie przechowywanego procesu z opcjonalnymi parametrami, tak że nie trzeba dodawać wartości zerowej dla każdego nieużywanego parametru?Entity Framework z opcjonalnymi parametrami?

Zapisany proces, którego muszę użyć, ma tylko 87 parametrów, z których 2 są wymagane. Naprawdę nienawidzę pomysłu, aby w każdym wywołaniu umieścić 85 zer.

Odpowiedz

7

Można użyć ObjectContext.ExecuteFunction metodę (DbContext jest opakowaniem nad ObjectContext), aby wykonać pewne procedury przechowywanej i listę parametrów pass:

FooEntities db = new FooEntities(); 
var objectContext = ((IObjectContextAdapter)db).ObjectContext; 
// create all parameters you need 
var name = new ObjectParameter("Name", "Lazy"); 
var age = new ObjectParameter("Age", 29); 

// call stored procedure with these two parameters only 
var result = objectContext.ExecuteFunction<Result>("ProcedureName", name, age); 

można zawinąć ten kod do metody rozszerzenia dla DbContext:

public static Result ProcedureName(this FooEntities db, name, age) 
{ 
    // code above 
} 

Wykorzystanie będzie jak: var result = db.ProcedureName("Lazy", 29);

+5

W przypadku gdy ktoś sprawdza to pytanie i używa EF6 o wyżej, można to zrobić za pomocą dbContext.Database.SqlQuery. Jeśli masz opcjonalne parametry, możesz ustawić wartość DbNull.Value. Możesz utworzyć do budowania SqlParameters, a gdy wartość jest null, ustawia DbNull.Value. Mam nadzieję, że to pomoże. –

+0

@FranciscoGoldenstein dzięki! Czas płynie, wszystko się zmienia) Dodam tag z odpowiednią wersją EF do pytania –

+1

dzięki @FranciscoGoldenstein –

1

Demonstruję komentarz @Francisco Goldensteina na temat odpowiedzi. Kolejność w poleceniu "EXEC SP_MySP @One, @Two, @Three, @Four" powinna być zgodna z parametrem procedury składowanej. Kolejność paraOne, paraTwo, itp. Nie ma znaczenia.

  public List<MySPEntity> GetMyData(int thirdValue, string firstValue) 
 
     { 
 
       var paraOne = new SqlParameter("@One", firstValue); 
 
       var paraTwo = new SqlParameter("@Two", DBNull.Value); 
 
       var paraThree = new SqlParameter("@Three", thirdValue); 
 
       var paraFour = new SqlParameter("@Four", DBNull.Value); 
 

 
       var result = DataContext.Database.SqlQuery<MySPEntity>("EXEC SP_MySP @One, @Two, @Three, @Four" 
 
       , paraTwo, paraOne, paraFour,paraThree).ToList(); 
 

 
       return result; 
 
      
 
     }

Powiązane problemy