2013-09-03 56 views
6

Tôi đang phát triển nhật ký liên hệ trong trang web sử dụng VS 2010, MVC3 và EF 5 - các thực thể được tạo bằng mã đầu tiên. Dữ liệu được lưu trữ trong bộ cơ sở dữ liệu SQL Server 2008 R2. Tôi muốn hiển thị bản tóm tắt nhật ký liên hệ và đã tạo chế độ xem.Sử dụng chế độ xem SQL từ mã khung thực thể Phiên bản đầu tiên 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 

Có hai đối tượng trong cơ sở dữ liệu Liên hệ Log (ContactLogEntriesContactLogCategories) và một cơ sở dữ liệu thực thể đầu tiên Control.dbo.EndUsers trong cơ sở dữ liệu khác. Nhật ký liên hệ có thể chứa một số lượng lớn các bản ghi. Tôi muốn có thể hiển thị chỉ các bản ghi cho một trường hợp cụ thể.

Câu hỏi của tôi là ở hai phần:

  1. Tôi có thể sử dụng SQL xem trực tiếp để hiển thị một bản tóm tắt trên một trang web (có lẽ bằng cách đọc nó vào một lớp học)
  2. Tôi có thể tạo một mã số đầu tiên đối tượng tương đương với khung nhìn SQL.

Trả lời

8

tìm thấy một giải pháp đơn giản cho câu hỏi 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(); 
    } 

Nó làm tất cả những gì cần thiết như vậy, mặc dù tôi quan tâm đến câu trả lời cho câu hỏi 2 Tôi có một giải pháp làm việc.

+1

Không có gì nói SQL Injection như nối chuỗi! – SwampyFox

+0

Không có SQL Injection ở đây. Một - đây là một ví dụ minh họa; hai, CaseID không được trả lại từ trang web. Tôi có thể có một cộng một của tôi trở lại xin vui lòng? –

+3

Peter - Tôi có thể hiểu rằng mã này là minh họa trong tự nhiên, nhưng không có cách nào mà người đọc có thể biết liệu CaseID có xuất phát từ thứ gì đó được đăng lên một biểu mẫu hay không.). Tôi sẽ đặt dấu cộng của bạn trở lại nếu bạn tham số hóa chuỗi. Nó sẽ làm cho mã của bạn lâu hơn một chút, nhưng, nó sẽ là một ví dụ vững chắc cho cộng đồng. Nó cũng sẽ cho phép SQL Server tạo một kế hoạch thực hiện cho truy vấn này để tái sử dụng sau này. – SwampyFox

22

Bạn chỉ có thể lập bản đồ Entity trực tiếp đến quan điểm sử dụng TableAttribute (annoations dữ liệu), hoặc ToTable trong Mappings thạo của bạn ...

Ví dụ sử dụng annotions dữ liệu:

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