मुझे इस SQL ​​​​कथन को LINQ पर पोर्ट करने की आवश्यकता है:

SELECT f.ID as IdFlight, 
       Tarif * 1 as Tarif, 
       f.Time, f.TimeOfArrival, 
       sl.Name as FromLoc, 
       sl.Country as FromCountry, 
       sl.Airport as FromAirport,
       dl.Name as ToLoc, 
       dl.Country as ToCountry, 
       dl.Airport as ToAirport 
FROM Flights as f 
    INNER JOIN Locations as sl ON sl.ID = f.ID_Source  
    INNER JOIN Locations as dl ON dl.ID = f.ID_Destination 
    INNER JOIN FlightsTarifs as ftf ON f.Id = ftf.IDFlight 
WHERE f.ID_Destination =30005 AND f.Time <= DATEADD(day,4,'2018/05/24 00:00') 
AND f.Time >= '2018/05/24 00:00' ORDER By f.Time, Tarif

लिंक में मेरा प्रयास:

IQueryable qinfo = from f in context.Flights
                   join sl in context.Locations on f.Id_Source equals sl.ID
                   join dl in context.Locations on f.Id_Destination equals dl.ID
                   join ftf in context.FlightsTarifs on f.ID equals ftf.IDFlight
                   where (f.Id_Source == aFormUser.FlightSrcID)
                   where (f.Id_Destination == aFormUser.FlightDestID)
                   where (f.Time.Date >= aFormUser.DepartureDate.Date)
                   where (f.Time.Date <= aFormUser.DepartureDate.Date.AddDays(4))
                   orderby f.Time, ftf.Tarif
                   select new {f.ID, ftf.Tarif, f.Time, f.TimeOfArrival,
                               sl.Name, sl.Country, sl.Airport,
                               dl.Name, dl.Country, dl.Airport  };

मुझे अब हल करने में कुछ समस्याएं हैं:

  1. चूंकि मैं स्रोत और गंतव्य स्थानों का नाम प्राप्त करने के लिए तालिका स्थानों के साथ तालिका उड़ानों में दो बार शामिल हो रहा हूं, इसलिए LinQ में ऐसा करने से एक कंपाइलर त्रुटि होती है, जो कहती है कि dl.Name, dl.Country, dl, Airport अज्ञात हैं। प्रकार और उनका अंत अन्य sl.Name, sl.देश, sl.airport के समान ही होगा।
  2. मैं "अस" अभिव्यक्ति का उपयोग नहीं कर सकता जैसा कि मैं एसक्यूएल में करता हूं या लिंक में कोई समकक्ष है?
  3. मैं लिंक क्वेरी में रहते हुए यात्रियों की संख्या से टैरिफ को गुणा नहीं कर सकता, जबकि यह मुझे ऐसा करने की अनुमति नहीं देता है।
4
user1238784 24 मई 2018, 17:22

2 जवाब

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

आप नीचे दिए गए कोड के साथ new ऑब्जेक्ट इनिशियलाइज़र के साथ उपनाम का उपयोग कर सकते हैं, जो टैरिफ को गुणा करने का भी समर्थन करेगा:

select new {
    f.ID,
    Tarif = ftf.Tarif * 1, // Alias and multiply by your number
    f.Time,
    f.TimeOfArrival,
    SourceName = sl.Name, // Alias
    SourceCountry = sl.Country, // Alias
    SourceAirport = sl.Airport, // Alias
    DestName = dl.Name, // Alias
    DestCountry = dl.Country, // Alias
    DestAirport = dl.Airport // Alias
};

यदि अन्य लोग इस पर ठोकर खाते हैं तो कुछ और विवरण प्रदान करने के लिए, मूल कारण यह है कि कोड एक अज्ञात प्रकार को परिभाषित करने के लिए new कीवर्ड का उपयोग कर रहा था ऑब्जेक्ट प्रारंभकर्ता जो अज्ञात वर्ग को परिभाषित करने की कोशिश कर रहे कई संघर्षों में भाग गया (एक ही अनुमानित नाम के साथ कई गुण, और फिर टैरिफ गुणा होने पर अभिव्यक्ति से संपत्ति का नाम देने में असमर्थ)।

विरोधों के साथ गुणों का स्पष्ट रूप से नामकरण करके, संकलक को अब उस नामकरण का अनुमान नहीं लगाना था जो संघर्ष उत्पन्न करता था।

अधिक: http://geekswithblogs.net/BlackRabbitCoder/archive/2012/06/21/c.net-little-wonders-the-joy-of-anonymous-types.aspx

अज्ञात प्रकारों के साथ ऑब्जेक्ट प्रारंभकर्ता का उपयोग करने के तरीके पर उपरोक्त लिंक में कुछ अतिरिक्त उदाहरण हैं।

3
Jason W 24 मई 2018, 18:13

इस अवधारणा को प्रोजेक्शन कहा जाता है, आपको अपनी आवश्यकता के अनुसार नए अनाम प्रकार या उपनाम का चयन करना होगा।

नमूना:

var result = data.Select( x => new { FieldName = x.Property } );
1
vivek nuna 24 मई 2018, 17:34