我对C#和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
这就是我想做的事情:
通过将两个变量col1和col2与Col1和Col2相匹配来查询Table1
。
,例如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
与{1}}和Col1
匹配的{1}项。以及Col2
中没有匹配的剩余Table1
项的列表。
大多数情况下,我坚持第三点,但我愿意接受任何建议和改进。
最后,我不知道这是否可行,我想将两个列表合并为一个。由于它们是不同类型,我不确定这是如何工作的。
我希望这一切都有道理。我一直试图绕过它一段时间,但我仍然难以理解如何创建查询。我也玩Table2
和Except()
,但没有太多运气。
非常感谢任何帮助。
答案 0 :(得分: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