-1

我想查看表 1 中的任何“行”是否包含在表 2 中,并使用 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。

干杯!

4

2 回答 2

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
  ) 
于 2013-11-13T11:17:46.190 回答
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();
于 2013-11-13T11:38:21.970 回答