मेरे पास मेरे SQL सर्वर डेटाबेस में निम्न 3 तालिका परिभाषाएं हैं:

+----------------------------------+-----------------+------------------------------------------------
|             Product              | Rating                          |         Image                   | 
+----------------------------------+-----------------+-------------------------------------------------
| ProductId                        | Id                              | Id                              |
| ProdctName                       | Rating                          | Image                           |
|                                  | ProductId FK References(Product)| ProductId FK References(Product)|
+----------------------------------+-----------------+---------------+----------------------------------

और इन तालिकाओं में निम्न नमूना डेटा होता है:

+----------------------------------+------------
|Product              | ProductId  |ProductName |
+----------------------------------+------------
|                     | 1          |Prodcuct 1  |
|                     | 2          |Prodcuct 2  |
|                     | 3          |Prodcuct 3  |
|                     | 4          |Prodcuct 4  |
+----------------------------------+------------+

+----------------------------------+----------------------+
|Rating              | Id          |RatingVal   |ProductId |
|+----------------------------------+-----------------------
|                     | 1          |3           |1         |
|                     | 2          |2           |2         | 
|                     | 3          |3           |2         |
|                     | 4          |5           |3         |
|                     | 5          |4           |3         |
+---------------------+------------+------------+----------+

+----------------------------------+----------------------+
|Image                | Id          |ImagePath  |ProductId
+----------------------------------+-----------------------
|                     | 1          |ABC           |1       |
|                     | 2          |XYZ           |2       | 
|                     | 3          |LMN           |3       |
|                     | 4          |PQR           |4       |
+---------------------+------------+------------+----------+

मुझे किसी उत्पाद के बारे में एक ही स्थान पर जानकारी एकत्र करने की आवश्यकता है, जैसे कि प्रत्येक उत्पाद में उत्पाद (उत्पाद तालिका से), संबंधित औसत रेटिंग (रेटिंग तालिका से) एम और उत्पाद के लिए छवि पथ (छवि तालिका से) के बारे में विवरण शामिल हैं। दूसरे शब्दों में मुझे निम्नलिखित आउटपुट की आवश्यकता है:

+----------------------------------+--------------------------------+
|Output               | ProductId  |ProductName |Avg(Rating)|ImgPath|
+----------------------------------+--------------------------------+
|                     | 1          |Prodcuct 1  |3          |ABC    |
|                     | 2          |Prodcuct 2  |2.5        |XYZ    |
|                     | 3          |Prodcuct 3  |4.5        |LMN    |
|                     | 4          |Prodcuct 4  |0.0        |PQR    |
+----------------------------------+------------+-----------+-------+

मैं इस डेटा को लाने के लिए इकाई फ्रेमवर्क का उपयोग कर रहा हूं, और मेरे कोड में संदर्भ वर्ग में इकाइयां (नीचे दिखाया गया है)।

मेरा प्रश्न है: मैं सभी उत्पादों के लिए अपना वांछित उत्पादन कैसे करूं। नीचे दिया गया मेरा कोड मेरे इच्छित सभी डेटा प्राप्त करने में सक्षम नहीं है। समस्या यह है कि id4 वाला उत्पाद परिणाम में नहीं दिखाया गया है, मुझे लगता है कि यह कारण है कि उत्पाद 4 में रेटिंग तालिका में कोई प्रविष्टि नहीं है।

var  trendingProducts = (from ratings in entities.Rating
                         group ratings by new { ratings.productId } into c
                         join products in entities.Products on c.FirstOrDefault().productId equals products.ProductID
                         join images in entities.Images on c.Key.productId equals images.ProductId                                       
                         select new ProductViewModel
                         {
                             ProductId = products.ProductId,
                             ProductName = products.ProductName,
                             RatingVal = c.Average(l => l.RatingVal) == null ? 0 : c.Average(l => l.Rating),
                             ImagePath = images.ImagePath,

                         }).ToList();
0
MBB 25 अगस्त 2018, 18:41
क्या आप कृपया प्राप्त होने वाले त्रुटि संदेश को भी पोस्ट कर सकते हैं? धन्यवाद
 – 
PiJei
25 अगस्त 2018, 18:47
हाय पिजेई देखने के लिए धन्यवाद, मुझे कोई त्रुटि या अपवाद नहीं मिल रहा है, हालांकि मुझे वांछित आउटपुट नहीं मिल रहा है जिसमें उत्पाद 4 के विवरण शामिल नहीं हैं
 – 
MBB
25 अगस्त 2018, 18:52
मैंने अभी देखा है कि रेटिंग के लिए आपकी तालिका में, आपके पास उत्पाद आईडी 4 के लिए कोई प्रविष्टि नहीं है, यही कारण हो सकता है।
 – 
PiJei
25 अगस्त 2018, 18:53
हां आप सही हैं और उस उत्पाद के लिए मुझे 0.0 के रूप में रेटिंग की आवश्यकता है जिसका मैंने आउटपुट परिणाम में उल्लेख किया है
 – 
MBB
25 अगस्त 2018, 18:55
फिर एक आंतरिक जुड़ाव करने के बजाय आपको सभी कुंजियों को संरक्षित करने के लिए एक पूर्ण बाहरी जुड़ाव की आवश्यकता होती है,
 – 
PiJei
25 अगस्त 2018, 19:00

1 उत्तर

सबसे बढ़िया उत्तर

तो आपके पास Products की एक तालिका, Ratings की एक तालिका और Images की एक तालिका है।

प्रत्येक Product में शून्य या अधिक Ratings हैं, प्रत्येक Rating विदेशी कुंजी ProductId का उपयोग करके ठीक एक Product से संबंधित है। इसी तरह, प्रत्येक Product में शून्य या अधिक Images होते हैं, प्रत्येक Image विदेशी कुंजी ProductId का उपयोग करते हुए ठीक एक Image से संबंधित होता है। बस मानक एक से कई संबंध।

ऐसा हो सकता है कि प्रत्येक Product का शून्य-या-एक Image हो: उस स्थिति में आपका शून्य-या-एक-से-एक संबंध है। कोड समान होगा। मुख्य अंतर यह है कि 'उत्पाद' में Images का संग्रह नहीं होगा, इसमें केवल एक वर्चुअल Image होगा।

अगर आप इकाई फ्रेमवर्क कोड फर्स्ट कन्वेंशन का पालन करते हैं, तो आप जैसे वर्ग हैं:

class Product
{
    public int Id {get; set;}

    // every Product has zero or more Ratings:
    public virtual ICollection<Rating> Ratings {get; set;}

    // every product has zero or more Images:
    public virtual ICollection<Image> Images {get; set;}

    ... // other properties
}

class Rating
{
    public int Id {get; set;}

    // every Rating belongs to exactly one Product using foreign key:
    public int ProductId {get; set;}
    public virtual Product Product {get; set;} 

    ...
}

class Image
{
    public int Id {get; set;}

    // every Image belongs to exactly one Product using foreign key:
    public int ProductId {get; set;}
    public virtual Product Product {get; set;} 

    ...
}

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

ध्यान दें कि निकाय ढांचे में सभी गैर-आभासी गुण आपकी तालिका में स्तंभ बन जाएंगे। सभी आभासी गुण तालिकाओं के बीच संबंधों का प्रतिनिधित्व करते हैं।

मुझे किसी उत्पाद के बारे में एक ही स्थान पर जानकारी एकत्र करने की आवश्यकता है, जैसे कि प्रत्येक उत्पाद में उत्पाद (उत्पाद तालिका से), संबंधित औसत रेटिंग (रेटिंग तालिका से) और उत्पाद के लिए छवि पथ (छवि तालिका से) के बारे में विवरण होता है।

जब भी लोग "ऑब्जेक्ट्स के साथ उनके उप-ऑब्जेक्ट" के लिए पूछताछ करते हैं तो वे एक (समूह) में शामिल हो जाते हैं। हालांकि, यदि आप निकाय ढांचे का उपयोग करते हैं तो इन प्रश्नों के लिए ICollections का उपयोग करना बहुत आसान है। यदि आप ICollection का उपयोग करते हैं, तो एंटिटी फ्रेमवर्क को पता चल जाएगा कि एक (समूह) शामिल होने की आवश्यकता है।

var result = myDbContext.Products            // from the collection of Products
    .Where(product => ...)                   // select only those Products that ...
    .Select(product => new                   // from every remaining Product make one new
    {                                        // object with the following properties:
         // Select only the properties you actually plan to use!
         Id = product.Id,
         Name = product.ProductName,
         ...

         AverageRating = product.Ratings       // from all Ratings of this Product
             .Select(rating => rating.Rating)  // get the Rating value
             .Average(),                       // and Average it.

         Images = product.Images               // from all Images of this product
             .Select(image => image.ImagePath) // select the ImagePath
             .ToList(),

         // or if a Product has only zero or one Image:
         Image = product.Image?.ImagePath // if the product has an Image, get its ImagePath
                                          // or use null if there is no Image
    });

आईसीओलेक्शन्स का उपयोग करने के बारे में अच्छी बात यह है कि कोड सरल और अधिक प्राकृतिक है, यह आपकी आवश्यकता के टेक्स्ट (समूह) में शामिल होने की तुलना में अधिक समान दिखता है। इसके अलावा, यदि दो से अधिक टेबल शामिल हैं (समूह) जुड़ते हैं तो भयानक लगते हैं।

मैं GroupJoin का उपयोग करके कोई समाधान देने का प्रयास नहीं करूंगा। मुझे यकीन है कि अन्य उत्तर इसे दिखाएंगे। तुलना करें और स्वयं देखें कि कौन सा समाधान समझने में आसान लगता है।

0
Harald Coppoolse 31 अगस्त 2018, 15:20