कैसे मैं सबसे सुंदर ढंग से एक्सप्रेस बाईं LINQ क्वेरी के रूप में कुल एसक्यूएल के साथ शामिल होते हैं

वोट
18

एसक्यूएल:

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<GETDATE()-1
GROUP BY u.Id, u.name
03/08/2008 को 22:22
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


4 जवाब

वोट
8

एक समाधान है, जो कोड को शून्य मान की हैंडलिंग defers हालांकि, हो सकता है:

दिनांक समय कल = DateTime.Now.Date.AddDays (-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 करने के लिए "जटिल" एसक्यूएल प्रश्नों हमेशा सरल नहीं है।

03/08/2008 को 22:31
का स्रोत उपयोगकर्ता

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

बस इसके बाद के संस्करण कोड youse और इस ठीक काम करना चाहिए!

18/04/2016 को 12:16
का स्रोत उपयोगकर्ता

वोट
0

आप उपयोग करना चाहते हैं के लिए जा रहे join intoनिर्माण एक समूह क्वेरी बनाने के लिए।

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);
    }
}
17/09/2008 को 06:28
का स्रोत उपयोगकर्ता

वोट
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'

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

28/08/2008 को 20:09
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more