在Linq查询中将join与String.Contains结合起来

Rod*_*iko 4 sql linq string join contains

我有以下linq查询,在两个表之间创建左连接:

            var joinResultRows = from leftTable in dataSet.Tables[leftTableName].AsEnumerable()
                             join
                                  rightTable in dataSet.Tables[rightTableName].AsEnumerable()
                                    on leftTable.Field<string>(leftComparedColumnName) equals rightTable.Field<string>(rightComparedColumnName)
                                        into leftJoinedResult
                             select new { leftTable, leftJoinedResult };
Run Code Online (Sandbox Code Playgroud)

我想获得回答这个的行:左列中的String值包含右列中的字符串值.

我试过这个:

            var joinResultRows = from leftTable in dataSet.Tables[leftTableName].AsEnumerable()
                             join
                                  rightTable in dataSet.Tables[rightTableName].AsEnumerable()
                                    on leftTable.Field<string>(leftComparedColumnName).Contains(rightTable.Field<string>(rightComparedColumnName)) equals true
                                        into leftJoinedResult
                             select new { leftTable, leftJoinedResult };
Run Code Online (Sandbox Code Playgroud)

但它不起作用导致在连接的左侧无法识别rightTable.

如何创建一个结果String.Contains的连接,我在'where'子句或'On'子句中执行包含吗?

Yan*_*ton 5

你试过SelectMany吗?

var result =
 from left in dataSet.Tables[leftTableName].AsEnumerable()
 from right in dataSet.Tables[rightTableName].AsEnumerable()
 where left.Field<string>(leftComparedColumnName).Contains(right.Field<string>(rightComparedColumnName))
 select new { left, right };
Run Code Online (Sandbox Code Playgroud)

编辑:

以下应该具有所需的效果:

class ContainsEqualityComparer: IEqualityComparer<string>
{
    public bool Equals(string right, string left) { return left.Contains(right); }
    public int GetHashCode(string obj) { return 0; }
}

var result =
    dataSet.Tables[leftTableName].AsEnumerable().GroupJoin(
        dataSet.Tables[rightTableName].AsEnumerable(),
        left => left,
        right => right,
        (left, leftJoinedResult) => new { left = left, leftJoinedResult = leftJoinedResult },
        new ContainsEqualityComparer());
Run Code Online (Sandbox Code Playgroud)

密钥比较通过自定义IEqualityComparer运行.只有当左边和右边的GetHashCode()相同时才会连接两行,而Equals返回true.

希望能帮助到你.