C#Linq检查具有动态列名的重复值

C#Linq检查具有动态列名的重复值,c#,.net,linq,C#,.net,Linq,我在SQL server中有一个表,有4列,如下所示 ID ColName Value Identifier 1 Name Test User 1 A100 2 Country USA A100 3 Name Test User 2 A101 4 Gender Male A101 5 Country France A101 6 Name Test User 3 A102 7 Country US

我在SQL server中有一个表,有4列,如下所示

ID  ColName Value       Identifier
1   Name    Test User 1 A100
2   Country USA         A100
3   Name    Test User 2 A101
4   Gender  Male        A101
5   Country France      A101
6   Name    Test User 3 A102
7   Country USA         A102
8   Name    Test User 1 A103
9   Country USA         A103
使用C#Linq,我试图找出上表中是否已经存在一个值。 例如,假设我有一个值, Name=Test User 1和Country=USA,如何有效地检查上表中是否已经存在这些值

我尝试过一种方法,但由于表中数据较大,速度非常慢

var userName = "Test User 1";
var country = "1-USA";

var results = records.SelectMany(x => x.UserDetails).Where(x => x.ColName.Equals("Name") && 
!string.IsNullOrEmpty(x.Value) && x.Value.Equals(userName )).ToList();

            if (results != null && results.Count > 0)
            {
                var identifiers = results.Select(x => x.Identifier).Distinct().ToList();

                var matchingCountries = records.SelectMany(x => x.UserDetails).
                Where(x => x.ColName.Equals("Country") && identifiers.Contains(x.Identifier)).ToList();

                var infoList = results.Select(x => new SearchInfoList { Name = x.Value, Identifier = x.Identifier,
                Country = (matchingCountries.Where(r => r.Identifier.Equals(x.Identifier)).Select(r => r.Value).FirstOrDefault()) }).ToList();

                infoList = infoList.Select(x => { x.Country = Helper.IncludeCode(codes, x.Country); return x; }).ToList();

                int recordCount = infoList.Where(x => x.Name.Equals(userName) && x.Country.Equals(country)).Count();


                if (recordCount > 0)
                {
                    return true;
                }
            }

是否有简单的方法使用C#Linq检查上表中是否存在具有相同标识符的匹配名称/国家组合?
提前感谢。

尝试使用
。Where
。如下图所示加入

var userDetails = records.SelectMany(x => x.UserDetails);
var isExists = userDetails.Where(x => x.ColName.Equals("Name") && !string.IsNullOrEmpty(x.Value) && x.Value.Equals(userName))
                          .Join(userDetails.Where(x => x.ColName.Equals("Country") && !string.IsNullOrEmpty(x.Value) && x.Value.Equals(country)), 
                                name => name.Identifier,
                                country => country.Identifier, 
                                (n, c) => new { Name = n, Country = c })
                          .Any();

要使上述代码更具可读性,您可以获得
名称
国家的
可枚举对象,如下所示注意当您在
名称
国家/地区
对象中获取值时,不要使用
.ToList()
。因为
.ToList()
将立即计算条件并为结果分配内存,而
可枚举的
对象将仅在需要时计算(即在这种情况下,它将使用
.Join
进行计算)。你可以参考


有多少“字段”必须匹配才能被视为重复。名称很明显,但还有哪些字段?只是“国家”吗?@DaniDev是的,名字和国家。也可能有其他字段,但是,我们只需要匹配2个字段。“有没有简单的方法可以使用C#Linq检查上表中是否已经存在具有相同标识符的匹配名称/国家组合?”是的,您需要将这些字段分组到列,并检查是否找到任何包含多个条目的分组。这是一种常见的方法是的,我找到了显示如何查找重复项的副本;)@MongZhu,我不确定我的问题是否重复。在我的例子中,数据是不同的。正如我在问题中提到的,具有相同标识符的名称/国家组合被视为匹配项。
var names = records.SelectMany(x => x.UserDetails).Where(x => x.ColName.Equals("Name") && !string.IsNullOrEmpty(x.Value) && x.Value.Equals(userName));
var countries = records.SelectMany(x => x.UserDetails).Where(x => x.ColName.Equals("Country") && !string.IsNullOrEmpty(x.Value) && x.Value.Equals(country));
var isExists = names.Join(countries, 
                          name => name.Identifier,
                          country => country.Identifier, 
                          (n, c) => new { Name = n, Country = c })
                    .Any();