1 Soalan: Bagaimanakah saya boleh "memperluaskan" hasil yang IQueryable berdasarkan pelbagai nilai?

soalan dicipta di Wed, May 8, 2019 12:00 AM

Saya cuba menentukan cara menggunakan Linq dalam IQueryable, untuk "meluaskan" entiti menjadi beberapa hasil pertanyaan berdasarkan pelbagai nilai. Khususnya, perbincangkan hasil setiap hari antara tarikh mula dan akhir, termasuk.

Berikut adalah entiti keprihatinan (yang telah diturunkan dan telah dilepaskan untuk penjelasan):

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; }
}

Sebagai contoh, katakan kami mempunyai:

Lokasi:

Id    Name
 1    Habitat
 2    Church

Tugasan Kerja:

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

Saya ingin mendapatkan yang berikut menggunakan Linq, sebaiknya menggunakan kaedah antara muka yang fasih. Adalah penting untuk melaksanakan "pengembangan" dalam pertanyaan (menjadikan DB bertanggungjawab). Set data penuh dan entiti rujukan adalah besar dan saya tidak mahu menjadi kenyataan menggunakan .ToList() dan foreach pernyataan.

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

Matlamat utama adalah untuk mendapatkan "pengembangan" di atas untuk dikelompokkan mengikut Lokasi (diarahkan pada LocationName) kemudian kumpulan pada Tarikh (diperintahkan menaik) dan kemudian dengan Nama untuk menyediakan lembaran log masuk untuk pekerja. Lembaran log masuk dikumpulkan mengikut lokasi, kemudian mengikut tarikh. Setiap helaian akan menyenaraikan pekerja untuk lokasi tertentu untuk tarikh tertentu.

Saya mempunyai pertanyaan pengelompokan yang digambarkan (terima kasih kepada Jon Skeet dan semua jawapan SO yang mengagumkan). Saya hanya memerlukan bantuan dengan perkembangan di atas, jika ia mungkin dilakukan dalam tempoh IQueryable.

    
0
1 Jawapan                              1                         

Satu penyelesaian adalah menggunakan jadual dimensi atau kalendar tarikh ( https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/) digabungkan dengan pandangan untuk mewakili julat tarikh anda untuk mengembalikan entiti yang mewakili setiap tarikh dalam julat.

Sebagai contoh:

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; }
}

Perhatikan bahawa WorkAssignmentDate tidak meluaskan WorkAssignment. Alasannya ialah jika anda memperluaskannya, apabila membuat pertanyaan WorkAssignment secara langsung EF akan cuba TIDAK DI terhadap pandangan yang kedua-dua tenggelam prestasi serta boleh menyebabkan masalah ketika cuba memuat satu baris. (Mungkin terdapat beberapa bentuk pemetaan yang boleh mengelakkan kelakuan ini) Anda boleh menetapkan Id sebagai PK untuk entiti berasaskan pandangan untuk memastikan EF senang, tetapi ia tidak akan menjadi pengecam baris unik. (jadi tiada kemas kini! Tidak masalah kerana ini memberi makan dari pandangan anyways)

Di mana vwWorkAssignment adalah pandangan yang menyertai WorkAssignment ke jadual DateDimension:

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

Entiti WorkAssignmentDate perlu dianggap sebagai entiti baca sahaja. Untuk mengemas kini tugasan kerja anda akan memuat dan menggunakan entiti WorkAssignment mengikut ID.

    
0
2019-05-09 00: 06: 28Z
sumber diletakkan di sini