2013-09-03 6 views
6

Ich entwickle ein Kontaktprotokoll in einer Website mit VS 2010, MVC3 und EF 5 - die Entitäten werden zuerst mit Code erstellt. Die Daten werden in einem SQL Server 2008 R2-Satz von Datenbanken gespeichert. Ich möchte eine Zusammenfassung des Kontaktprotokolls anzeigen und habe eine Sicht erstellt.Verwenden einer SQL-Ansicht aus einem Entity Framework-Code Erste Version 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 

Es gibt zwei Einheiten in der Kontakt Log-Datenbank (ContactLogEntries und ContactLogCategories) und einer Datenbank erste Einheit Control.dbo.EndUsers in einer anderen Datenbank. Das Kontaktprotokoll könnte eine große Anzahl von Datensätzen enthalten. Ich möchte nur die Datensätze für einen bestimmten Fall anzeigen können.

Meine Frage ist in zwei Teilen:

  1. Kann ich die SQL-Ansicht verwenden, um direkt eine Zusammenfassung auf einer Webseite angezeigt werden (vielleicht indem sie sie in eine Klasse zu lesen)
  2. Kann ich einen Code zuerst erstellen Objekt entspricht der SQL-Ansicht.

Antwort

8

eine einfache Lösung gefunden Frage 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(); 
    } 

Es tut das alles so erforderlich ist, obwohl ich Interesse an einer Antwort bin ich 2 eine funktionierende Lösung in Frage zu stellen.

+1

Nichts sagt SQL Injection wie String-Verkettung! – SwampyFox

+0

Keine SQL-Injektion hier. Einer - das ist ein illustratives Beispiel; zwei, CaseID wird nicht von der Website zurückgegeben. Kann ich bitte mein Plus zurückhaben? –

+3

Peter - Ich kann verstehen, dass dieser Code illustrativer Natur ist, aber es gibt keine Möglichkeit, dass ein Leser wissen könnte, ob CaseID von etwas kommt, das entweder an ein Formular gesendet wird (zB edit oder aus einer Abfragezeichenfolge kommt)). Ich gebe Ihr Plus zurück, wenn Sie die Zeichenfolge parametrisieren. Es wird Ihren Code ein wenig länger machen, aber es wird ein solides Beispiel für die Community sein. Darüber hinaus kann SQL Server einen Ausführungsplan für diese Abfrage zur späteren Wiederverwendung erstellen. – SwampyFox

22

Sie können die Entity nur direkt den Blick Table (Daten annoations), oder Totable in Ihrem Fluent Mappings ...

Zum Beispiel unter Verwendung von Daten annotions:

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 
    { 
     ... 
    } 
}