5

我正在使用 ASP.NET MVC 中的图像库,并试图同时了解 LINQ to SQL。我有 3 个表来保存图片库数据,通过链接表具有多对多关系。这些是 :

图库
(ID、名称、描述)

图片
(ID、标题、描述、文件名)

GalleryImage
(GalleryId,ImageId)

GalleryImage 已设置到其他两个表的 FK 关系。

我希望能够加载我的画廊,并显示与每个画廊关联的图像,以及能够显示单个图像并列出与其关联的画廊。由于我是 Linq to SQL 的新手,我不知道该怎么做。有人可以指导我吗?

4

4 回答 4

2

步骤 1:创建表之间的关联。你会知道这是正确完成的

  • 类 Gallery 有属性 GalleryImages
  • 类 GalleryImage 具有属性 Gallery 和 Image (注意,单数)
  • Image 类具有属性 GalleryImages。

http://msdn.microsoft.com/en-us/library/bb629295.aspx

第 2 步:获取画廊列表:

using (CustomDataContext myDC = new CustomDataContext)
{
  List<Gallery> result = myDC.Galleries.ToList();
}

第 3 步:然后用户点击一个画廊,你想要它的图像:

using (CustomDataContext myDC = new CustomDataContext)
{
  List<Image> result = myDC.Galleries
    .Where(g => g.Id = selectedGallery.Id);
    .SelectMany(g => g.GalleryImages)
    .Select(gi => gi.Image)
    .ToList()
}

第 4 步:然后用户单击图像,您想要它的画廊:

using (CustomDataContext myDC = new CustomDataContext)
{
  List<Gallery> result = myDC.Images
    .Where(i => i.Id = selectedImage.Id);
    .SelectMany(i => i.GalleryImages)
    .Select(gi => gi.Galleries)
    .ToList()
}

如果您只想加载整个数据库,请执行以下操作:

using (CustomDataContext myDC = new CustomDataContext)
{
  DataLoadOptions dlo = new DataLoadOptions();
  dlo.LoadWith<Gallery>(g => g.GalleryImages);
  dlo.LoadWith<GalleryImage>(gi => gi.Image);
  myDC.LoadOptions = dlo;

  List<Gallery> result = myDC.Galleries.ToList();
}

之后,整个对象图将被加载并连接以供您使用。

于 2010-06-29T14:29:44.467 回答
1

您需要通过 DataContext 对象访问所有这些。

查看为您的 dbml 生成的 c# 文件,并查找标有 Association 属性的 EntitySet 集合——Gallary 和 Image 中应该有一个,GallaryImage 中应该有 2 个。如果正确生成了 dbml,您应该能够执行以下操作 -

在我的脑海中,我很确定设计表面会将Gallery的复数命名为Gallerys而不是Galleries,所以这不是错字 -

DataConext dc = new GalleryDataConext();
foreach (Gallery g in dc.Gallerys)
{
  Console.Writeline("gallery id " + g.Id.ToString());
  foreach(GalleryImage gi in g.GalleryImages)
   {
      Console.Writeline("galleryimage id " + gi.Id.ToString());
      foreach(Image i in gi)
       {
         Console.Writeline("image id " + i.Id.ToString());
       }
   }

即使没有关联,以下内容也应该有效 -

int GalID = 1;
GalleryDataConext dc = new GalleryDataConext()
var pics = from g in dc.Gallary
           join gi in dc.GallaryImages on g.Id equals gi.GallaryId
           join i in dc.Images on gi.ImageId equals i.Id
           where g.Id = GalID
           select i;

要从 pic id 获取画廊,你会做 -

int PicID = 1;
var gals = from g in dc.Gallary
           join gi in dc.GallaryImages on g.Id equals gi.GallaryId
           join i in dc.Images on gi.ImageId equals i.Id
           where i.Id = PicID
           select g;

上面将返回一个IQueryable<Gallary>并在您枚举它时执行 sql 查询。

于 2010-06-29T13:48:31.227 回答
1
Gallery.GalleryImages<GalleryImage>

您应该能够通过它访问您的 GalleryImage 对象,然后在每个 GalleryImage 上您可以调用:

GalleryImage.Image

这假设关系在 DBML 设计器中表示?

于 2010-06-29T08:32:43.487 回答
-1

您需要在表之间创建关系。如果您确定已创建关系,则可能是类的子属性或父属性可能设置为 internet,它们应该是公共的

于 2010-06-29T14:07:03.660 回答