使用linq比较和检索另一个表中存在的表中的值集

时间:2013-11-13 11:03:19

标签: c# sql linq duplicates

我想看看表1中是否包含表1中的任何“行”,并使用LINQ从表2中提取它们。

示例场景:

table {
   int ID
   int RowID
   int ColumnID
   string cellvalue
}

表1

1, 1, 1, A
2, 1, 2, B
3, 2, 1, C
4, 2, 2, D

代表

A | B
C | D

表2

1, 1, 1, X
2, 1, 2, Y
3, 6, 1, A
4, 6, 2, C
5, 8, 1, A
6, 8, 2, B
7, 9, 1, A
8, 9, 2, B

代表

X | Y
A | C
A | B
A | B

所以在上面的例子中,表1中的(A | B)也在表2(A | B)中两次。

我想从表2中得到的结果是:

5, 8, 1, A
6, 8, 2, B
7, 9, 1, A
8, 9, 2, B

我试图将group by用于另一个查询然后包含但是我迷路了。我认为如果我将其转换为形成实际的行但在LINQ中没有枢轴可能会更容易。

我很可能会跳过一些简单的事情,如果有人可以帮忙的话?如果有更好的答案,它不一定是LINQ。

干杯!

2 个答案:

答案 0 :(得分:0)

我不知道LINQ,但SQL查询将是:

Select T2.Id, T2.RowID, T2.ColumnID, T2.CellValue 
From Table12 T2 
where 
  exists(
    Select 1 From Table1 T1 
      where T1.ID=T2.ID and 
            T1.RowID=T2.RowID and 
            T1.ColumnID=T2.ColunID and 
            T1.CellValue=T2.CellValue
  ) 

答案 1 :(得分:0)

尝试一下:

备选方案1:

List<Table> table = new List<Table>() { 
    new Table(1, 1, 1, "A"),
    new Table(2, 1, 2, "B"),
    new Table(3, 2, 1, "C"),
    new Table(4, 2, 2, "D")
};

List<string> rowsTable1 = table.GroupBy(x => x.RowID)
                               .Select(x => string.Join(",", x.Select(y => y.Cellvalue).ToArray()))
                               .ToList();


List<Table> table2 = new List<Table>() { 
    new Table(1, 1, 1, "X"),
    new Table(2, 1, 2, "Y"),
    new Table(3, 6, 1, "A"),
    new Table(4, 6, 2, "C"),
    new Table(5, 8, 1, "A"),
    new Table(6, 8, 2, "B"),
    new Table(7, 9, 1, "A"),
    new Table(8, 9, 2, "B")
};

List<Table> table3 = table2.GroupBy(x => x.RowID)
                           .Where(x => rowsTable1.Contains(string.Join(",", x.Select(y => y.Cellvalue).ToArray())))
                           .SelectMany(x => x.Select(y => y))
                           .ToList();

它通过将行连接成一个由','分隔的单个字符串来组成行。它使用这个组合来比较它们并在第二个表上找到那些行。

此代码不考虑以不同方式订购商品的可能性。但这可以根据需要进行调整。

备选方案2:

public class Table 
{
   public int ID {get;set;}
   public int RowID{get;set;}
   public int ColumnID{get;set;}
   public string Cellvalue { get; set; }

   public Table(int id, int rowid, int columnid, string cellvalue)
   {
       ID = id;
       RowID = rowid;
       ColumnID = columnid;
       Cellvalue = cellvalue;
   }
}

public class TableRow
{
    public List<string> Values { get; set; }

    public TableRow (IGrouping<int,Table> group)
    {
        Values = group.OrderBy(y => y.ColumnID)
                      .Select(y => y.Cellvalue)
                      .ToList();
    }

    public override bool Equals(object obj)
    {
        TableRow row = obj as TableRow;
        if (row != null)
        {
            if (row.Values != null && row.Values.Count == Values.Count)
            {
                for (int i = 0; i < Values.Count; i++)
                {
                    if (Values[i] != row.Values[i])
                    {
                        return false;
                    }
                }

                return true;
            }
        }

        return base.Equals(obj);
    }
}


List<Table> table = new List<Table>() { 
    new Table(1, 1, 1, "A"),
    new Table(2, 1, 2, "B"),
    new Table(3, 2, 1, "C"),
    new Table(4, 2, 2, "D")
};

List<TableRow> rowsTable1 = table.GroupBy(x => x.RowID)
                                 .Select(x => new TableRow(x))
                                 .ToList();

List<Table> table2 = new List<Table>() { 
    new Table(1, 1, 1, "X"),
    new Table(2, 1, 2, "Y"),
    new Table(3, 6, 1, "A"),
    new Table(4, 6, 2, "C"),
    new Table(5, 8, 1, "A"),
    new Table(6, 8, 2, "B"),
    new Table(7, 9, 1, "A"),
    new Table(8, 9, 2, "B")
};

List<Table> table3 = table2.GroupBy(x => x.RowID)
                           .Where(x => rowsTable1.Exists(y=> y.Equals(new TableRow(x))))
                           .SelectMany(x =>  (IEnumerable<Table>)x)
                           .ToList();