2013-09-03 15 views
6

Zajmuję się tworzeniem dziennika kontaktów na stronie internetowej przy użyciu VS 2010, MVC3 i EF 5 - podmioty są tworzone przy użyciu kodu pierwszego. Dane są przechowywane w zestawie baz danych SQL Server 2008 R2. Chcę wyświetlić podsumowanie rejestru kontaktów i utworzyć widok.Korzystanie z widoku SQL z kodu Entity Framework Pierwsza wersja 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 

Istnieją dwa podmioty w bazie Kontakt Log (ContactLogEntries i ContactLogCategories) oraz bazy pierwszego podmiotu Control.dbo.EndUsers w innej bazie danych. Dziennik kontaktów może zawierać dużą liczbę rekordów. Chcę móc wyświetlać tylko rekordy dla konkretnego przypadku.

Moje pytanie składa się z dwóch części:

  1. mogę korzystać z widoku SQL bezpośrednio do wyświetlania podsumowania na stronie internetowej (być może po przeczytaniu go w klasie)
  2. mogę utworzyć pierwszy kod obiekt równoważny z widokiem SQL.

Odpowiedz

8

Znaleziony proste rozwiązanie Pytanie 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(); 
    } 

Czyni wszystko, co wymagane tak, chociaż jestem zainteresowanie w odpowiedzi na pytanie 2 Mam roztwór roboczy.

+1

Nic nie mówi SQL Injection jak konkatenacja ciągów! – SwampyFox

+0

Brak SQL Injection tutaj. Jeden - jest to przykład ilustracyjny; dwa, CaseID nie jest zwracany ze strony internetowej. Czy mogę poprosić o mój plus jeden? –

+3

Peter - Rozumiem, że ten kod ma charakter ilustracyjny, ale nie ma możliwości, aby czytelnik mógł się dowiedzieć, czy CaseID pochodzi z czegoś, co jest umieszczone w formularzu (np. I edytować, czy pochodzi z ciągu zapytania)). Zwrócę ci plus, jeśli sparametryzujesz ciąg. To sprawi, że twój kod będzie trochę dłuższy, ale będzie to solidny przykład dla społeczności. Pozwoli to również SQL Server na stworzenie planu wykonania dla tego zapytania do ponownego użycia. – SwampyFox

22

Można tylko map podmiot bezpośrednio do widoku za pomocą TableAttribute (annoations danych), lub ToTable w swoim Fluent Mappings ...

na przykład za pomocą annotions danych:

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 
    { 
     ... 
    } 
} 
Powiązane problemy