2010-06-29 20 views
5

मैं एएसपी.नेट एमवीसी में एक छवि गैलरी के साथ खेल रहा हूं, और एक ही समय में LINQ से SQL के आसपास अपना सिर प्राप्त करने का प्रयास कर रहा हूं। मेरे पास एक लिंक टेबल के माध्यम से कई सारे रिश्तों के साथ छवि गैलरी डेटा रखने के लिए 3 टेबल हैं। ये हैं:LINQ से SQL मूल प्रश्न - तालिका संबंध

गैलरी
(आईडी, नाम, विवरण)

छवि
(आईडी, शीर्षक, विवरण, फ़ाइल का नाम)

Galleryimage
(GalleryId, ImageId)

गैलरी छवि में एफके रिश्ते अन्य दो तालिकाओं तक स्थापित हैं।

मैं अपनी दीर्घाओं को लोड करने में सक्षम होना चाहता हूं, और प्रत्येक के साथ जुड़े चित्रों को प्रदर्शित करना चाहता हूं, साथ ही साथ एक ही छवि प्रदर्शित करने की क्षमता रखता हूं और जिस गैलरी से जुड़ा हुआ है उसे सूचीबद्ध करता हूं। चूंकि मैं लिंक से एसक्यूएल में नया हूं, मुझे नहीं पता कि यह कैसे करें। क्या कोई मुझे मार्गदर्शन कर सकता है, कृपया?

उत्तर

1

चरण 1: तालिकाओं के बीच संघ बनाएं।आप जब

  • वर्ग गैलरी संपत्ति GalleryImages
  • वर्ग Galleryimage संपत्ति गैलरी और छवि (ध्यान दें, एकवचन)
  • वर्ग छवि संपत्ति 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(); 
} 

कि करने के बाद, पूरी वस्तु ग्राफ भरी हुई है और अपने उपयोग के लिए जोड़ा जाएगा।

+0

धन्यवाद। मुझे कुछ बहुत ही गलत गलत करना होगा, लेकिन मेरे जीवन के लिए यह नहीं देख सकता कि यह क्या है। मेरे डीबी टेबल में रिश्तों को परिभाषित किया गया है, मेरा डीबीएमएल आरेख उन रिश्तों को दिखाता है, और फिर भी मेरी संस्थाओं को गुणों की अपेक्षा नहीं है। – ZombieSheep

+0

शामिल संपत्तियों के प्रकारों की जांच करें। चींटियों को तारों, या इंट्स के लिए तारों से संबंधित देखने के लिए देखें। यह भी सुनिश्चित करें कि डीबीएमएल में प्राथमिक कुंजी हैं। LinqToSql उन प्राथमिक कुंजी के बिना ऑब्जेक्ट पहचान (या संबंधपरक गुण और ऑब्जेक्ट ग्राफ़ बनाने) को ट्रैक नहीं कर सकता है। –

+0

वह था। मेरे संबंध तालिका में कुंजी सेट नहीं थी - किसी कारण से मैंने माना कि इसे केवल उनकी आवश्यकता नहीं है, केवल एफके। धन्यवाद। :) – ZombieSheep

1
Gallery.GalleryImages<GalleryImage> 

आपको लगता है कि के माध्यम से अपने Galleryimage वस्तुओं का उपयोग करने के लिए सक्षम होना चाहिए, और फिर प्रत्येक Galleryimage पर कॉल कर सकते हैं:

GalleryImage.Image 

इसमें यह माना जाता रिश्तों dbml डिजाइनर में प्रतिनिधित्व कर रहे हैं?

+0

धन्यवाद - संबंध डीबीएमएल डिजाइनर में मौजूद हैं, लेकिन GalleryImages प्रॉपर्टी IntelliSense में नहीं आती है। मुझे यकीन नहीं है कि मैंने सही ढंग से डीएमबीएल बनाया है - मैंने टेबल की सतह की सतह पर खींच लिया है, और सभी ठीक दिखते हैं, लेकिन जब मैं गैलरी लोड करता हूं ('गैलरी से गैलरी से गैलरी चुनिंदा गैलरी;'), मैं केवल गैलरी पैरेंट आइटम प्राप्त करें। क्या डेटा प्राप्त करने का गलत तरीका है? – ZombieSheep

1

आपको इसे अपने डेटाकॉन्टेक्स्ट ऑब्जेक्ट के माध्यम से एक्सेस करना होगा।

अपने डीबीएमएल के लिए जेनरेट की गई सी # फ़ाइल में एक नज़र डालें और एसोसिएशन विशेषता के साथ चिह्नित एंटीटीसेट संग्रहों की तलाश करें - गैलरी और छवि में एक और गैलरी इमेज में 2 होना चाहिए। यदि डीबीएमएल सही ढंग से उत्पन्न होता है, तो आपको निम्न की तरह कुछ करने में सक्षम होना चाहिए -

मेरे सिर के ऊपर से, मुझे पूरा यकीन है कि डिजाइन सतह गैलरी के बजाय गैलरी के रूप में गैलरी के बहुवचन का नाम रखेगी, इसलिए यह एक टाइपो नहीं है -

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; 

एक तस्वीर आईडी से gallaries पाने के लिए आपको क्या करना चाहते हैं -

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> वापस कर देगा और जब आप इसका अनुमान लगाते हैं तो एसक्यूएल क्वेरी करेंगे।

+0

ऐसा लगता है कि मेरे जेनरेट किए गए कोड में एसोसिएशन हैं जिनके बारे में आप बात करते हैं, लेकिन मेरे पास मेरे कोड में उनके पास पहुंच नहीं है। ऐसा लगता है कि जेनरेट की गई गैलरी इकाई में गैलरी छवि वस्तुओं का संग्रह नहीं है। मैंने यह देखने के लिए संस्थाओं को फिर से बनाने की भी कोशिश की है कि मैंने पहली बार बेवकूफ कुछ किया है, लेकिन कोई खुशी नहीं है। मैंने अंतिम 2 उदाहरणों के लिए उत्थान किया है, हालांकि मुझे उम्मीद थी कि उन्हें प्राप्त करने के लिए स्पष्ट मार्ग नीचे नहीं जाना पड़ेगा। – ZombieSheep

-1

आपको टेबल के बीच संबंध बनाने की आवश्यकता है। यदि आप सुनिश्चित हैं कि आपने रिश्ते बनाए हैं तो कक्षाओं के बच्चे या मूल गुण इंटरनेट पर सेट किए जा सकते हैं, उन्हें सार्वजनिक होना चाहिए