LINQ – Επιστροφή δεδομένων από εμφανίσεις λίστας 2

LINQ – Επιστροφή δεδομένων από εμφανίσεις λίστας 2

Λύση για το LINQ – Επιστροφή δεδομένων από τη λίστα 2 εμφανίσεων
Δίνεται παρακάτω:

Έχω μια λίστα με int που ονομάζεται "motor_list" =2, 3, 5, 3, 8, 5, 5, 9, 8 (Λίστα 2)

(3 = 2 times in the list)
(5 = 3 times)

Έχω έναν πίνακα (Item), της οποίας σειρά περιεχομένου "ItemId, Name, Date, Location" και είναι μόνο δεδομένα περιεχομένου 2 :

(ItemId) = 3 and 5. (List 1)

var data = _context.Item.Where(x => motor_list.Contains(x.ItemId));

Χρησιμοποιώντας τον παραπάνω κώδικα, λαμβάνω μόνο δύο δεδομένα που είναι προφανώς σωστά τεχνικά,

τώρα θέλω να λάβω δεδομένα αλλά σύμφωνα με την εμφάνιση του motor_list (Λίστα 2),
και κανένα για τον πίνακα αντικειμένων.

Εννοώ ότι θέλω να πάρω κάτι σαν :

ItemId 3 should pull 2 times the same data, and
ItemId 5 should pull 3 times.

Δοκιμάστε αυτόν τον κωδικό

    List<int> list1 = new List<int>() { 3, 5 };
    List<int> list2 = new List<int>() { 2, 3, 5, 3, 8, 5, 5, 9, 8 };

    var data = list2.GroupBy(x => x).Where(a => list1.Contains(a.Key));

   var result=   data.Select(g => $"ItemId {g.Key} should pull {g.Count()} times").ToList();

foreach (var item in result)
{
    Console.WriteLine(item);
}

Δεν είμαι σίγουρος τι εννοείτε με τον όρο "Το ItemId 3 πρέπει να αντλεί 2 φορές τα ίδια δεδομένα" . Φαίνεται ότι είτε θέλετε τον αριθμό κάθε ItemId στο motor_list είτε θέλετε να επιστραφούν τα διπλότυπα στοιχεία στα αποτελέσματα.

Δείτε πώς μπορείτε να το πετύχετε:

class Item
{
    public int ItemId { get; set; }
}

static void Main(string[] args)
{
    List<Item> contextItems = new List<Item> { new Item { ItemId = 3 }, new Item { ItemId = 5 } };

    var motor_list = new List<int> { 2, 3, 5, 3, 8, 5, 5, 9, 8 };

    // To get the count of each contextItem in motor_list:
    var itemCount = contextItems
            .Select(contextItem => 
                motor_list.Count(motorId => motorId == contextItem.ItemId))
            .ToList();

    // result: { 2, 3 }

    // To get duplicate items for each contextItem in motor_list
    var items = motor_list
            .Where(motorId => 
                contextItems.Any(contextItem => contextItem.ItemId == motorId))
            .ToList();

    // result: { 3, 5, 3, 5, 5 }
}

Χρησιμοποιήστε το join για να επιστρέψετε ακριβώς τα στοιχεία στο motor_list .

var data = motor_list
           .Join(_context.Item,
           left => left,
           right => right.ItemId,
           (left, right) => new { items = right }); 

ή λίγο πιο μακριά

var data = _context.Item.ToList();
var result = lst.Select(x => new
     {
        item = data.Where(a => a.ID == x).FirstOrDefault()
     }).Where(a=>a.item != null).ToList();