কিভাবে LINQ কোয়েরি হিসাবে সমষ্টি এসকিউএল সঙ্গে বাম যোগ সর্বাধিক elegantly করবেন

এসকিউএল:

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

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

এটি ঠিক একই এসকিউএল উত্পন্ন করে না, কিন্তু একই লজিকাল ফলাফল প্রদান করে না। "জটিল" এসএলকিউএল এসকিউএল ল্যাংগুয়েজ অনুবাদ করা সবসময় সহজবোধ্য নয়।

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
যোগ

এটি আপনার জন্য একটি পূর্ণ উত্তর নয়, তবে বাম অংশে অংশগ্রহন করলে আপনি ডিফল্ট এফেক্টের অপারেটরটি ব্যবহার করতে পারেন।

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
যোগ