首先,我強烈建議使用T4模板生成您的數據模型類,所以看看這個項目:linq2db/t4models。我也推薦看這裏的視頻:https://github.com/linq2db/linq2db/wiki。
具有T4生成我的數據模型後,它會是這個樣子:
public partial class TestDb : LinqToDB.Data.DataConnection
{
public ITable<Directory> Directories { get { return this.GetTable<Directory>(); } }
public ITable<File> Files { get { return this.GetTable<File>(); } }
}
[Table(Schema="dbo", Name="Directory")]
public partial class Directory
{
[PrimaryKey, Identity] public int ID { get; set; } // int
[Column, NotNull ] public string Path { get; set; } // varchar(max)
#region Associations
/// <summary>
/// FK_File_Directory_BackReference
/// </summary>
[Association(ThisKey="ID", OtherKey="DirectoryID", CanBeNull=true, IsBackReference=true)]
public List<File> Files { get; set; }
#endregion
}
[Table(Schema="dbo", Name="File")]
public partial class File
{
[PrimaryKey, Identity] public int ID { get; set; } // int
[Column, NotNull ] public int DirectoryID { get; set; } // int
[Column, NotNull ] public string Name { get; set; } // varchar(max)
#region Associations
/// <summary>
/// FK_File_Directory
/// </summary>
[Association(ThisKey="DirectoryID", OtherKey="ID", CanBeNull=false, KeyName="FK_File_Directory", BackReferenceName="Files")]
public Directory Directory { get; set; }
#endregion
}
現在有幾種方式來加載目錄及其文件。這裏有幾個:
[Test] // 1 query to load directories + separate queries to load files for each directory
public void Test()
{
LinqToDB.Common.Configuration.Linq.AllowMultipleQuery = true;
using(var db = new TestDb())
{
var directoriesWithFiles = db.Directories.LoadWith(d => d.Files).ToList();
}
}
[Test] // same as above, but manually
public void Test2()
{
using(var db = new TestDb())
{
var directories = db.Directories.ToList();
foreach (var d in directories)
{
d.Files = db.Files.Where(f => f.DirectoryID == d.ID).ToList();
}
}
}
[Test] // if you want only 2 queries to the database
public void Test3()
{
using (var db = new TestDb())
{
var dict = new Dictionary<int, List<File>>();
foreach(var file in db.Files)
{
if(!dict.ContainsKey(file.DirectoryID))
dict.Add(file.DirectoryID, new List<File> { file });
else
dict[file.DirectoryID].Add(file);
}
var directories = db.Directories.ToList();
foreach (var d in directories)
{
List<File> files;
d.Files = dict.TryGetValue(d.ID, out files) ? files : new List<File>();
}
}
}
或者你可以做一個連接,在1個查詢負載的一切,然後在內存中的文件手動連接到目錄。你可以編寫自己的擴展方法來簡化它。
linq2db https://github.com/linq2db/linq2db – Ten
謝謝,我更新了標籤維基。我以前從來沒有聽說過。 – jessehouwing