Как запросить две таблицы для сопоставления значений с linq и C #?

1

Я новичок в С# и Linq, и у меня возникают проблемы с запросом двух таблиц для сопоставления значений.

Где я работаю в качестве стажера, мы используем шаблон хранилища данных. Например, для запроса таблицы sql я бы использовал это выражение linq: _entities.Atable.Where(x => x.Col1 == col1 && x.Col2 == col2). Переменная _entities представляет собой интерфейс всех таблиц в модели базы данных.

Предположим, у меня есть две таблицы Table1 и Table2. Ниже приведены столбцы каждой таблицы:

Table1: Col1, Col2, colA, ColB
Table2: Col1, col2, ColC, ColD

Вот что я хотел бы сделать:

  • Table1 запросов Table1 путем сопоставления двух переменных, col1 и col2, с Col1 и Col2.

    Например, List1 = _entities.Table1.Where(x => x.Col1 == col1 && x.Col2 == col2).ToList()

  • Затем запросите Table2 для любых записей, где Table2.Col1 и Table2.Col2 соответствуют List1.Col1 и List1.Col2. Эти результаты также могут быть сохранены в списке List2.

    Например, List2 = _entities.Table2.Where(x => x.Col1 == List1.Col1 && x.Col2 == List1.Col2).ToList()

  • Затем создайте третий список List3, содержащий все элементы из Table1 которые не соответствуют элементам из Table2

В конце концов, я хотел бы иметь список Table2 элементов, которые соответствуют Table1 по Col1 и Col2. И список оставшихся Table1 элементов, для которых не было равных в Table2.

В основном, я застрял в третьем пункте, но я открыт для любых предложений и улучшений.

Наконец, и я не знаю, возможно ли это, я хотел бы объединить два списка в один. Поскольку они разные типы, я не уверен, как это будет работать.

Надеюсь, все это имеет смысл. Я пытался немного обмануть его, но я все еще не понимаю, как создавать запросы. Я также играл с Except() и Intersect() но не имел большой удачи.

Любая помощь будет принята с благодарностью.

Теги:
linq

1 ответ

2
Лучший ответ

Обычно я считаю, что Any является самым ясным методом для сопоставления нескольких значений из разных типов.

class Type1
{
    public int Key1 { get; set; }
    public int Key2 { get; set; }
    public string Type1Prop { get; set; }
    public Type1(int key1, int key2, string prop)
    {
        Key1 = key1;
        Key2 = key2;
        Type1Prop = prop;
    }
}

class Type2
{
    public int Key1 { get; set; }
    public int Key2 { get; set; }
    public string Type2Prop { get; set; }
    public Type2(int key1, int key2, string prop)
    {
        Key1 = key1;
        Key2 = key2;
        Type2Prop = prop;
    }
}

public void Main()
{   
    var list1 = new List<Type1>
    {
        new Type1(1,1,"Value"), new Type1(1,2,"Value"), new Type1(2,1,"Value"), new Type1(2,2,"Value")
    };
    var list2 = new List<Type2>
    {
        new Type2(1,1,"Value"), new Type2(2,1,"Value"), new Type2(3,1,"Value")
    };
    var in1ButNot2 = list1.Where(item => !list2.Any(item2 => item2.Key1 == item.Key1 && item2.Key2 == item.Key2)).ToList();
    var in2ButNot1 = list2.Where(item => !list1.Any(item2 => item2.Key1 == item.Key1 && item2.Key2 == item.Key2)).ToList();
    var in1And2 = list2.Where(item => list1.Any(item2 => item2.Key1 == item.Key1 && item2.Key2 == item.Key2)).ToList();
    in1ButNot2.ForEach(item => Console.WriteLine("in1ButNot2 - Key1={0},Key2={1}", item.Key1, item.Key2));
    in2ButNot1.ForEach(item => Console.WriteLine("in2ButNot1 - Key1={0},Key2={1}", item.Key1, item.Key2));
    in1And2.ForEach(item => Console.WriteLine("in1And2 - Key1={0},Key2={1}", item.Key1, item.Key2));
}

Это заканчивает вывод ниже и показывает все способы, которыми вы можете пересечь данные. Сочетание списков - это то, что вам нужно будет выяснить, если вы просто хотите использовать ключи, тогда вы можете создать общий тип, который вы конвертируете, чтобы создать объединенный список.

in1ButNot2 - Key1=1,Key2=2
in1ButNot2 - Key1=2,Key2=2
in2ButNot1 - Key1=3,Key2=1
in1And2 - Key1=1,Key2=1
in1And2 - Key1=2,Key2=1
  • 0
    Отличный ответ! Именно то, на что я надеялся. Большое спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню