2013-09-03 4 views
6

Sto sviluppando un registro dei contatti in un sito Web utilizzando VS 2010, MVC3 ed EF 5: le entità vengono create utilizzando il codice per primo. I dati vengono archiviati in un set di database SQL Server 2008 R2. Voglio visualizzare un riepilogo del registro dei contatti e ho creato una vista.Utilizzo di una vista SQL da un codice Entity Framework Prima versione 5

CREATE VIEW dbo.ContactLogSummaries 

AS 

SELECT 
    CLE.ContactLogEntryID, 
    CLE.CaseID, 
    'Test' AS ContactName, 
    EU.UserName As OfficeUser, 
    CLE.DateAndTimeOfContact, 
    CLC.Category, 
    CLE.ContactDetails 

FROM 
    ContactLogEntries AS CLE 
    JOIN 
    ContactLogCategories AS CLC 
    ON CLE.ContactLogCategoryID = CLC.ContactLogCategoryID 
    JOIN 
    Control.dbo.EndUsers AS EU 
    ON CLE.UserID = EU.EnduserID 

ci sono due entità nel database dei contatti Log (ContactLogEntries e ContactLogCategories) e un database prima entità Control.dbo.EndUsers in un altro database. Il registro dei contatti può contenere un numero elevato di record. Voglio essere in grado di visualizzare solo i record per un caso specifico.

La mia domanda è in due parti:

  1. Posso usare la vista SQL direttamente per visualizzare un riepilogo su una pagina web (magari leggendo in una classe)
  2. Posso creare un codice prima oggetto equivalente alla vista SQL.

risposta

8

trovato una soluzione semplice alla domanda 1:

public class ContactLogSummary 
{ 
    public int ContactLogEntryID { get; set; } 
    public int MaternalCaseID { get; set; } 
    public String ContactName { get; set; } 
    public String OfficeUser { get; set; } 
    public DateTime DateAndTimeOfContact { get; set; } 
    public String Category { get; set; } 
    public String ContactDetails { get; set; } 

    public static List<ContactLogSummary> LoadContactListSummary 
              (int caseID, String connectionString); 
    { 
     MyDataContext dbContext = new MyDataContext(connectionString); 
     return dbContext.Database.SqlQuery<ContactLogSummary> 
       ("SELECT * FROM dbo.ContactLogSummaries WHERE MaternalCaseID = @CaseID ORDER BY ContactLogEntryID DESC", 
            new SqlParameter("CaseID", caseID)).ToList(); 
    } 

fa tutto quello che serve così, anche se sono di interesse in una risposta alla domanda 2 ho una soluzione di lavoro.

+1

Niente dice SQL Injection come la concatenazione di stringhe! – SwampyFox

+0

Nessuna iniezione SQL qui. Uno - questo è un esempio illustrativo; due, CaseID non viene restituito dal sito web. Posso avere il mio più uno per favore? –

+3

Peter - Riesco a capire che questo codice è di natura illustrativa, ma, in nessun modo, un lettore può sapere se CaseID proviene o meno da qualcosa che viene pubblicato in un modulo (ad esempio, modifica o arriva da una stringa di query). Metterò il tuo valore aggiunto se parametrizzi la stringa. Renderà il tuo codice un po 'più lungo, ma sarà un valido esempio per la community. Consente inoltre a SQL Server di creare un piano di esecuzione per questa query per il successivo riutilizzo. – SwampyFox

22

Si può solo mappare l'Ente direttamente alla vista utilizzando TableAttribute (annoations dati), o ToTable nei tuoi Mapping Fluent ...

ad esempio utilizzando annotions dati:

using System; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 

public namespace whatever.mynamespace 

    [Table("dbo.ContactLogSummaries")] //<-- this is your view 
    public class ContactLogSummary 
    { 
     ... 
    } 
}