Я новичок в С# и 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()
но не имел большой удачи.
Любая помощь будет принята с благодарностью.
Обычно я считаю, что 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