代码之家  ›  专栏  ›  技术社区  ›  ZombieSheep

LINQ到SQL的基本问题表关系

  •  5
  • ZombieSheep  · 技术社区  · 14 年前

    画廊

    图像
    (Id、标题、说明、文件名)

    美术馆
    (GalleryId、ImageId)

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

    我希望能够加载我的图库,并显示与每一个相关联的图像,以及有能力显示一个单一的图像,并列出与之相关联的图库。因为我对linqtosql还不熟悉,所以我不知道怎么做。有人能指引我吗?

    4 回复  |  直到 14 年前
        1
  •  2
  •   Amy B    14 年前

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

    • 类库有属性GalleryImages
    • GalleryImage类具有属性库和图像(注,单数)

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

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

        2
  •  1
  •   Amethi    14 年前
    Gallery.GalleryImages<GalleryImage>
    

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

    GalleryImage.Image
    

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

        3
  •  1
  •   Frank Tzanabetis    14 年前

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

    在我的脑海里,我很肯定的设计表面将画廊的复数命名为画廊,而不是画廊,所以它不是一个打字错误-

    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;
    

    如果你想从照片上查到胆小鬼的身份证-

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

        4
  •  -1
  •   Tassadaque    14 年前

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