c# - चयन और चयन करें के बीच अंतर




linq-to-sql linq (8)

मैं Select और SelectMany बीच अंतर खोज रहा SelectMany लेकिन मुझे उपयुक्त उत्तर नहीं मिला है। LINQ से SQL का उपयोग करते समय मुझे अंतर सीखना होगा, लेकिन मुझे जो कुछ मिला है वह मानक सरणी उदाहरण हैं।

क्या कोई एसक्यूएल उदाहरण के लिए LINQ प्रदान कर सकता है?


कुछ चयन कई आवश्यक नहीं हो सकता है। नीचे 2 प्रश्न एक ही परिणाम देते हैं।

Customers.Where(c=>c.Name=="Tom").SelectMany(c=>c.Orders)

Orders.Where(o=>o.Customer.Name=="Tom")

1 से कई रिश्तों के लिए,

  1. अगर "1" से शुरू करें, SelectMany की आवश्यकता है, यह कई लोगों को flattens।
  2. अगर "बहुत से" से शुरू करें, SelectMany की आवश्यकता नहीं है। ( अभी भी "1" से फ़िल्टर करने में सक्षम हो , यह भी मानक शामिल क्वेरी से नीचे सरल है)
from o in Orders
join c in Customers on o.CustomerID equals c.ID
where c.Name == "Tom"
select o

जब क्वेरी एक स्ट्रिंग (चार की सरणी) लौटाती है तो यह अधिक स्पष्ट होता है:

उदाहरण के लिए यदि सूची 'फल' में 'सेब' है

'चयन' स्ट्रिंग देता है:

Fruits.Select(s=>s) 

[0]: "apple"

'SelectMany' स्ट्रिंग को फ़्लैट करता है:

Fruits.SelectMany(s=>s)

[0]: 97  'a'
[1]: 112 'p'
[2]: 112 'p'
[3]: 108 'l'
[4]: 101 'e'

बहुत तकनीकी प्राप्त किए बिना - कई संगठनों के साथ डेटाबेस, प्रत्येक उपयोगकर्ता के साथ प्रत्येक: -

var orgId = "123456789";

var userList1 = db.Organizations
                   .Where(a => a.OrganizationId == orgId)
                   .SelectMany(a => a.Users)
                   .ToList();

var userList2 = db.Users
                   .Where(a => a.OrganizationId == orgId)
                   .ToList();

दोनों चयनित संगठन के लिए एक ही एप्लीकेशन यूज़र सूची लौटते हैं।

संगठन से उपयोगकर्ताओं तक पहली "परियोजनाएं", दूसरा उपयोगकर्ता तालिका सीधे पूछताछ करता है।


मुझे लगता है कि यह समझने का सबसे अच्छा तरीका है।

            var query =
            Enumerable
                .Range(1, 10)
                .SelectMany(ints => Enumerable.Range(1, 10), (a, b) => $"{a} * {b} = {a * b}")
                .ToArray();

        Console.WriteLine(string.Join(Environment.NewLine, query));

        Console.Read();

गुणा तालिका उदाहरण।


सूचियों की सूचियों की सूची लौटने वाले कई SelectMany प्रश्नों का चयन करें। उदाहरण के लिए

public class PhoneNumber
{
    public string Number { get; set; }
}

public class Person
{
    public IEnumerable<PhoneNumber> PhoneNumbers { get; set; }
    public string Name { get; set; }
}

IEnumerable<Person> people = new List<Person>();

// Select gets a list of lists of phone numbers
IEnumerable<IEnumerable<PhoneNumber>> phoneLists = people.Select(p => p.PhoneNumbers);

// SelectMany flattens it to just a list of phone numbers.
IEnumerable<PhoneNumber> phoneNumbers = people.SelectMany(p => p.PhoneNumbers);

// And to include data from the parent in the result: 
// pass an expression to the second parameter (resultSelector) in the overload:
var directory = people
   .SelectMany(p => p.PhoneNumbers,
               (parent, child) => new { parent.Name, child.Number });

.NET Fiddle पर लाइव डेमो


स्रोत तत्व से परिणाम तत्व में एक सरल एक-से-एक प्रक्षेपण का चयन करें। चयन करें- क्वेरी अभिव्यक्ति में खंडों से कई होने पर कई का उपयोग किया जाता है: मूल अनुक्रम में प्रत्येक तत्व का उपयोग एक नया अनुक्रम उत्पन्न करने के लिए किया जाता है।


SelectMany() आपको एक बहुआयामी अनुक्रम को इस तरह से ध्वस्त करने देता है जिससे अन्यथा किसी दूसरे Select() या लूप की आवश्यकता होती है।

इस ब्लॉग पोस्ट पर अधिक जानकारी।


SelectMany लिए कई अधिभार हैं। उनमें से एक पदानुक्रम की यात्रा करते समय माता-पिता और बच्चों के बीच किसी भी रिश्ते का पता लगाने की अनुमति देता है।

उदाहरण : मान लें कि आपके पास निम्न संरचना है: League -> Teams -> Player

आप आसानी से खिलाड़ियों का एक फ्लैट संग्रह वापस कर सकते हैं। हालांकि आप जिस टीम का हिस्सा हैं, उस टीम के लिए आप कोई संदर्भ खो सकते हैं।

सौभाग्य से इस उद्देश्य के लिए एक अधिभार है:

var teamsAndTheirLeagues = 
         from helper in leagues.SelectMany
               ( l => l.Teams
                 , ( league, team ) => new { league, team } )
                      where helper.team.Players.Count > 2 
                           && helper.league.Teams.Count < 10
                           select new 
                                  { LeagueID = helper.league.ID
                                    , Team = helper.team 
                                   };

पिछले उदाहरण दान के आईके ब्लॉग से लिया गया है:

http://blogs.interknowlogy.com/2008/10/10/use-linqs-selectmany-method-to-flatten-collections/

मैं दृढ़ता से अनुशंसा करता हूं कि आप इसे देखें।







linq