1 Câu hỏi: Làm thế nào tôi có thể mở rộng các kết quả IQueryable dựa trên một loạt các giá trị?

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi đang cố gắng xác định cách sử dụng Linq trong IQueryable, để "mở rộng" một thực thể thành nhiều kết quả truy vấn dựa trên một phạm vi giá trị. Cụ thể, bao gồm kết quả mở rộng mỗi ngày giữa ngày bắt đầu và ngày kết thúc, bao gồm.

Sau đây là các thực thể đáng quan tâm (đã được giảm nhẹ và đã xóa các chú thích cho rõ ràng):

public class Location {
    public int Id { get; set; }
    public string Name { get; set; }
}
public class WorkAssignment {
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public virtual Location Location { get; set; }
    public int LocationId { get; set; }
}

Ví dụ vì lợi ích, giả sử chúng ta có:

Vị trí:

Id    Name
 1    Habitat
 2    Church

Phân công công việc:

Id   Name         Start         End      LocationId
 1   Jim       29-Apr-2019   3-May-2019      1
 2   Natasha    4-May-2019   7-May-2019      2
 3   Jennifer   5-May-2019   6-May-2019      2

Tôi muốn có được những điều sau bằng cách sử dụng Linq, tốt nhất là sử dụng các phương thức giao diện trôi chảy. Điều quan trọng là phải thực hiện "mở rộng" trong truy vấn (làm cho DB chịu trách nhiệm). Tập hợp dữ liệu đầy đủ và các thực thể được tham chiếu là lớn và tôi không muốn cụ thể hóa bằng cách sử dụng các câu lệnh .ToList()foreach.

WorkerName    Date      LocationId   LocationName
Jim        29-Apr-2019      1          Habitat
Jim        30-Apr-2019      1          Habitat
Jim         1-May-2019      1          Habitat
Jim         2-May-2019      1          Habitat
Jim         3-May-2019      1          Habitat
Natasha     4-May-2019      2          Church
Natasha     5-May-2019      2          Church
Natasha     6-May-2019      2          Church
Natasha     7-May-2019      2          Church
Jennifer    5-May-2019      2          Church
Jennifer    6-May-2019      2          Church

Mục tiêu cuối cùng là có được "mở rộng" ở trên để nhóm theo Vị trí (được đặt hàng trên LocationName) sau đó nhóm vào Ngày (được tăng dần) và sau đó theo Tên để cung cấp trang đăng nhập cho nhân viên. Các tờ đăng nhập được nhóm theo vị trí, sau đó theo ngày. Mỗi tờ sẽ liệt kê các công nhân cho một vị trí cụ thể cho một ngày cụ thể.

Tôi đã tìm ra truy vấn nhóm (nhờ Jon Skeet và tất cả các câu trả lời SO tuyệt vời của anh ấy). Tôi chỉ cần trợ giúp với bản mở rộng ở trên, nếu thậm chí có thể thực hiện được trong số IQueryable.

    
0
1 Câu trả lời                              1                         

Một giải pháp sẽ là sử dụng bảng thứ nguyên lịch hoặc ngày ( https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calWiki-table-in-sql-server/) kết hợp với chế độ xem để thể hiện phạm vi ngày của bạn để trả về một thực thể đại diện cho mỗi ngày trong phạm vi.

Ví dụ:

public class WorkAssignment {
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public virtual Location Location { get; set; }
    public int LocationId { get; set; }
}

[Table("vwWorkAssignmentByDate")]
public class WorkAssignmentDate 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public virtual Location Location { get; set; }
    public int LocationId { get; set; }
    public DateTime Date { get; set; }
}

Lưu ý rằng WorkAss queDate không mở rộng WorkAssocation. Lý do cho điều này là vì nếu bạn mở rộng nó, khi truy vấn trực tiếp WorkAssocation, EF sẽ cố gắng KHÔNG VÀO chế độ xem vừa là hiệu suất chìm vừa có thể gây ra sự cố khi cố gắng tải một hàng. (Có thể có một số dạng ánh xạ có thể tránh hành vi này) Bạn có thể đặt Id làm PK cho thực thể dựa trên chế độ xem để giữ cho EF hài lòng, nhưng nó sẽ không phải là một định danh hàng duy nhất. (vì vậy không có cập nhật! Không phải là vấn đề vì đây là nguồn cấp dữ liệu từ chế độ xem dù sao)

Trong đó vwWorkAssocation là chế độ xem tham gia WorkAssocation vào bảng DateDimension:

SELECT wa.*, dd.Date
FROM dbo.WorkAssignment wa 
INNER JOIN dbo.DateDimension dd 
  ON dd.Date >= wa.StartDate AND dd.Date <= wa.EndDate

Thực thể WorkAss queDate sẽ cần được coi là một thực thể chỉ đọc. Để cập nhật phân công công việc, bạn sẽ tải và sử dụng thực thể WorkAss gán theo ID.

    
0
2019-05-09 00: 06: 28Z
nguồn đặt đây