LINQ to SQL Basic问题 - 表关系

时间:2010-06-29 08:30:42

标签: c# asp.net-mvc linq-to-sql relationship

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

  


  (身份证,姓名,说明)

     

图像
  (Id,Title,Description,FileName)

     

GalleryImage
  (GalleryId,ImageId)

GalleryImage将FK关系设置为其他两个表。

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

4 个答案:

答案 0 :(得分:1)

Gallery.GalleryImages<GalleryImage>

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

GalleryImage.Image

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

答案 1 :(得分:1)

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

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

在我的脑海中,我很确定设计界面会将Gallery的复数命名为Gallerys而不是画廊,所以这不是拼写错误 -

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查询。

答案 2 :(得分:1)

步骤1:创建表之间的关联。

时你会知道这是正确完成的
  • class Gallery有属性GalleryImages
  • 类GalleryImage具有属性Gallery和Image(注意,单数)
  • class 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();
}

完成此操作后,将加载并连接整个对象图供您使用。

答案 3 :(得分:-1)

您需要在表之间创建关系。如果你确定你已经创建了关系,那么可能是类的子或父属性可能被设置为互联网,他们应该公开