मैं LINQ क्वेरी के रूप में कुल SQL के साथ बाएं से जुड़ने के लिए सबसे स्पष्ट रूप से अभिव्यक्त कैसे व्यक्त करूं

एसक्यूएल:

SELECT
   u.id,
   u.name,
   isnull(MAX(h.dateCol), '1900-01-01') dateColWithDefault
FROM universe u
LEFT JOIN history h 
   ON u.id=h.id 
   AND h.dateCol
0
जोड़ा संपादित
विचारों: 1

3 उत्तर

एक समाधान, यद्यपि कोड में शून्य मान के संचालन को रोकता है, यह हो सकता है:

डेटटाइम कल = डेटटाइम.अब.डेट.एडडेज़ (-1);

var collection=
    from u in db.Universe
    select new
    {
        u.id,
        u.name,
        MaxDate =(DateTime?)
       (
           from h in db.History
           where u.Id == h.Id
           && h.dateCol < yesterday
           select h.dateCol 
       ).Max()
    };

यह बिल्कुल एक ही एसक्यूएल का उत्पादन नहीं करता है, लेकिन एक ही तार्किक परिणाम प्रदान करता है। LINQ के लिए "जटिल" SQL क्वेरी का अनुवाद करना हमेशा सीधा नहीं होता है।

0
जोड़ा

आप समूह क्वेरी बनाने के लिए निर्माण में शामिल होना चाहते हैं।

TestContext db = new TestContext(CreateSparqlTripleStore());
var q = from a in db.Album
        join t in db.Track on a.Name equals t.AlbumName into tracks
        select new Album{Name = a.Name, Tracks = tracks};
foreach(var album in q){
    Console.WriteLine(album.Name);
    foreach (Track track in album.Tracks)
    {
        Console.WriteLine(track.Title);
    }
}
0
जोड़ा

यह आपके लिए एक पूर्ण उत्तर नहीं है, लेकिन बाईं ओर टुकड़े में शामिल होने पर आप DefaultIfEmpty ऑपरेटर का उपयोग इस प्रकार कर सकते हैं:

var collection = 
from u in db.Universe
join history in db.History on u.id = history.id into temp
from h in temp.DefaultIfEmpty()
where h.dateCol < DateTime.Now.Date.AddDays(-1)
select u.id, u.name, h.dateCol ?? '1900-01-01'

मुझे अभी तक किसी भी समूह के आदेशों को करने की आवश्यकता नहीं है, इसलिए मैंने इसे गलत रास्ते पर भेजने के लिए बाहर नहीं छोड़ा। ध्यान देने के लिए दो अन्य त्वरित चीजें। मैं वास्तव में दो मानकों पर शामिल होने में असमर्थ रहा हूं, हालांकि ऊपर के रूप में इसके आसपास जाने के तरीके हैं। यह भी ?? ऑपरेटर एसक्यूएल में isnull के स्थान पर वास्तव में अच्छी तरह से काम करता है।

0
जोड़ा