লিঙ্ক থেকে স্ক্যুয়াল: একাধিক বাম বাইরের সাথে যোগ দেয়


160

লিনকিউ থেকে এসকিউএল ব্যবহার করে কীভাবে একাধিক বাম বাহ্যিক জোড় ব্যবহার করবেন তা নির্ধারণ করতে আমার কিছুটা সমস্যা হচ্ছে। আমি বুঝতে পারি কীভাবে একটি বাম বাহ্যিক জোড় ব্যবহার করবেন। আমি ভিবি.এনইটি ব্যবহার করছি। নীচে আমার এসকিউএল সিনট্যাক্স রয়েছে।

টি-এসকিউএল

SELECT
    o.OrderNumber,
    v.VendorName,
    s.StatusName
FROM
    Orders o
LEFT OUTER JOIN Vendors v ON
    v.Id = o.VendorId
LEFT OUTER JOIN Status s ON
    s.Id = o.StatusId
WHERE
    o.OrderNumber >= 100000 AND
    o.OrderNumber <= 200000

উত্তর:


247

এটি ক্লিনার হতে পারে ( আপনার সমস্ত intoবিবৃতি দরকার নেই ):

var query = 
    from order in dc.Orders
    from vendor 
    in dc.Vendors
        .Where(v => v.Id == order.VendorId)
        .DefaultIfEmpty()
    from status 
    in dc.Status
        .Where(s => s.Id == order.StatusId)
        .DefaultIfEmpty()
    select new { Order = order, Vendor = vendor, Status = status } 
    //Vendor and Status properties will be null if the left join is null

এখানে আরও একটি বাম যোগদানের উদাহরণ রয়েছে

var results = 
    from expense in expenseDataContext.ExpenseDtos
    where expense.Id == expenseId //some expense id that was passed in
    from category 
    // left join on categories table if exists
    in expenseDataContext.CategoryDtos
                         .Where(c => c.Id == expense.CategoryId)
                         .DefaultIfEmpty() 
    // left join on expense type table if exists
    from expenseType 
    in expenseDataContext.ExpenseTypeDtos
                         .Where(e => e.Id == expense.ExpenseTypeId)
                         .DefaultIfEmpty()
    // left join on currency table if exists
    from currency 
    in expenseDataContext.CurrencyDtos
                         .Where(c => c.CurrencyID == expense.FKCurrencyID)
                         .DefaultIfEmpty() 
    select new 
    { 
        Expense = expense,
        // category will be null if join doesn't exist
        Category = category,
        // expensetype will be null if join doesn't exist
        ExpenseType = expenseType,
        // currency will be null if join doesn't exist
        Currency = currency  
    }

12
@ মিত্রা: না, আপনি আসলে বাম আউটয়ার জয়েন স্টেটমেন্ট পাবেন (কোনও নেস্টেড বাছাই করা নেই)। খুব পাগল হাহ?
আমির

6
বিবৃতিতে সমস্ত বিবরণ ব্যবহার করার চেয়ে আমি এই পদ্ধতির পছন্দ করি। এই পোস্ট করার জন্য ধন্যবাদ!
ব্রায়ান রথ

7
এটি সব ধরণের মিষ্টি। তবে: ডাব্লুটিএফএফ কেন যোগ দিলে লিঙ্কে বামে যোগ দেবে না? কোন সেট-ভিত্তিক বিশ্বের কেবল অন্তর্ের সাথে যোগ দেয়? গরগর।
jcollum

2
এটি কেবল আমার মুখে একটি বড় হাসি ফেলেছে। সহজে অনুসরণযোগ্য উদাহরণের জন্য ধন্যবাদ।
নাইডদান

2
আমি এটি চেষ্টা করেছিলাম এবং এটি @ টভানফসনের পদ্ধতির চেয়ে ধীর গতির একটি ক্রম ছিল। আমি এটি সরাসরি কোনও ডাটাবেসের বিরুদ্ধে করছিলাম না, বরং কঠোরভাবে লিনক অবজেক্টে রেখেছি। আমার কাছে 500000 ব্যয়, 4000 বিভাগের ডেটোস এবং 4000 ব্যয় টাইপডটোসের সমতুল্য ছিল। এটি চালাতে 1 মিনিট সময় নিয়েছে। টভানফসনের সিনট্যাক্সের সাথে এটি লাগে 6 সেকেন্ড।
ক্রিস

49

ভিজ্যুয়ালস্টুডিওতে অ্যাক্সেস নেই (আমি আমার ম্যাকটিতে আছি), তবে http://bhaidar.net/cs/archive/2007/08/01/left-outer-join-in-linq-to থেকে তথ্য ব্যবহার করে -sql.aspx দেখে মনে হচ্ছে আপনি এরকম কিছু করতে সক্ষম হতে পারেন:

var query = from o in dc.Orders
            join v in dc.Vendors on o.VendorId equals v.Id into ov
            from x in ov.DefaultIfEmpty()
            join s in dc.Status on o.StatusId equals s.Id into os
            from y in os.DefaultIfEmpty()
            select new { o.OrderNumber, x.VendorName, y.StatusName }

22

আমি কীভাবে একাধিক বাম বহিরঙ্গনকে এসকিউএল থেকে লিনকিউ ব্যবহার করে ভিবি.এনইটি-তে যোগদান করতে পারি তা বুঝতে পেরেছি:

Dim db As New ContractDataContext()

Dim query = From o In db.Orders _
            Group Join v In db.Vendors _
            On v.VendorNumber Equals o.VendorNumber _
            Into ov = Group _
            From x In ov.DefaultIfEmpty() _
            Group Join s In db.Status _
            On s.Id Equals o.StatusId Into os = Group _
            From y In os.DefaultIfEmpty() _
            Where o.OrderNumber >= 100000 And o.OrderNumber <= 200000 _
            Select Vendor_Name = x.Name, _
                   Order_Number = o.OrderNumber, _
                   Status_Name = y.StatusName

8

ভিবি.এনইটি ফাংশন ব্যবহার করে,

Dim query = From order In dc.Orders
            From vendor In 
            dc.Vendors.Where(Function(v) v.Id = order.VendorId).DefaultIfEmpty()
            From status In 
            dc.Status.Where(Function(s) s.Id = order.StatusId).DefaultIfEmpty()
            Select Order = order, Vendor = vendor, Status = status 

3

আমি মনে করি আপনার এই পোস্টে ব্যবহৃত পদ্ধতিটি অনুসরণ করতে সক্ষম হওয়া উচিত । এটি দেখতে দেখতে খুব কুৎসিত লাগে, তবে আমি মনে করি আপনি এটি দুটিবার করতে পারেন এবং আপনি যে ফলাফল চান তা পেতে পারেন।

আমি ভাবছি যদি এটি আসলে এমন কোনও ঘটনা যেখানে আপনি DataContext.ExecuteCommand(...)লিঙ্কে রূপান্তরিত না করে ব্যবহার করা ভাল better


0

আমি আমার অ্যাপ্লিকেশনটির জন্য এই লিনক কোয়েরিটি ব্যবহার করছি। যদি এটি আপনার প্রয়োজনের সাথে মেলে তবে আপনি এটি উল্লেখ করতে পারেন। এখানে আমি 3 টি টেবিল সহ (বাম বাহিরের যোগদান) যোগদান করেছি।

 Dim result = (From csL In contractEntity.CSLogin.Where(Function(cs) cs.Login = login AndAlso cs.Password = password).DefaultIfEmpty
                   From usrT In contractEntity.UserType.Where(Function(uTyp) uTyp.UserTypeID = csL.UserTyp).DefaultIfEmpty ' <== makes join left join
                   From kunD In contractEntity.EmployeeMaster.Where(Function(kunDat) kunDat.CSLoginID = csL.CSLoginID).DefaultIfEmpty
                   Select New With {
                  .CSLoginID = csL.CSLoginID,
                  .UserType = csL.UserTyp}).ToList()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.