如何使用linq和C#查询两个表的匹配值?

时间:2014-06-06 00:52:45

标签: c# sql linq

我对C#和Linq很陌生,我在查询两个表的匹配值时遇到了一些麻烦。

在我作为实习生工作的地方,我们使用工作单元库模式。例如,要查询sql表,我将使用此linq表达式:_entities.Atable.Where(x => x.Col1 == col1 && x.Col2 == col2)_entities变量表示数据库模型中所有表的接口。

假设我有两个表Table1Table2。以下是每个表的列:

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()

  • 然后,在Table2Table2.Col1匹配Table2.Col2List1.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项的列表。

大多数情况下,我坚持第三点,但我愿意接受任何建议和改进。

最后,我不知道这是否可行,我想将两个列表合并为一个。由于它们是不同类型,我不确定这是如何工作的。

我希望这一切都有道理。我一直试图绕过它一段时间,但我仍然难以理解如何创建查询。我也玩Table2Except(),但没有太多运气。

非常感谢任何帮助。

1 个答案:

答案 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