C#Linq检查具有动态列名的重复值
我在SQL server中有一个表,有4列,如下所示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
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();