Левый / правый / внутренний соединения с использованием C # и LINQ - PullRequest
0 голосов
/ 17 апреля 2010

Я пытаюсь выяснить, как выполнить серию запросов, чтобы получать обновления, удалять и вставлять сегрегированные в свои вызовы. У меня есть 2 таблицы, по одной в каждой из 2 баз данных. Одна - это база данных каналов только для чтения, а другая - источник T-SQL R / W Production. Существует несколько общих столбцов key между ними.

Что я делаю, чтобы настроить это:

List<model.AutoWithImage> feedProductList = _dbFeed.AutoWithImage.Where(a => a.ClientID == ClientID).ToList();
List<model.vwCompanyDetails> companyDetailList = _dbRiv.vwCompanyDetails.Where(a => a.ClientID == ClientID).ToList();
foreach (model.vwCompanyDetails companyDetail in companyDetailList)
{
    List<model.Product> productList = _dbRiv.Product.Include("Company").Where(a => a.Company.CompanyId == companyDetail.CompanyId).ToList();
}

Теперь, когда у меня есть (исходный) список продуктов из ленты и существующий (целевой) список продуктов из моей базы данных, я бы хотел сделать 3 вещи:

  1. Найти все SKU в ленте, которых нет в цели
  2. Найдите все SKU, которые есть в обоих активных продуктах, и обновите цель
  3. Найти все SKU, которые есть в обоих неактивны и мягко удалены из цели

Каковы лучшие практики для этого без двойного цикла? Я бы предпочел решение LINQ 4 Objects, поскольку у меня уже есть мои объекты.

РЕДАКТИРОВАТЬ: Кстати, мне нужно будет перенести информацию из строк подачи в целевые строки в первых 2 случаях, просто установите флаг в последнем случае.

1024 * ТИА *

1 Ответ

1 голос
/ 17 апреля 2010

Подход LINQ-to-objects будет выглядеть как демонстрация. Здесь у меня есть два списка строк, и я хочу получить совпадения, элементы из альф не в бета-версиях и элементы из бета-версий не в альфа. Синтаксис LINQ довольно прост.

List<string> alphas = new List<string>() { "a", "b", "c", "d", "e" };
List<string> betas = new List<string>() { "a", "c", "e", "g", "i" };

var matches = from alpha in alphas
                join beta in betas
                on alpha equals beta
                select alpha;

var noBetas = from alpha in alphas
                join beta in betas
                on alpha equals beta
                into gj
                from b in gj.DefaultIfEmpty()
                where b == null
                select alpha;

var noAlphas = from beta in betas
                join alpha in alphas
                on beta equals alpha
                into gj
                from a in gj.DefaultIfEmpty()
                where a == null
                select beta;

Результатом каждого является IEnumerable<string>, и повторение совпадений покажет a, c и e. noBetas даст b и d. noAlphas даст g и i.

Я полагаю, это то, что вы просили. Примените это к своим спискам объектов, объединив ключевые поля вместо моего упрощенного сценария, когда одна строка совпадает с другой.

...