У меня есть таблица на SQL-сервере с 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, я пытаюсь выяснить, существует ли уже значение в приведенной выше таблице. Например, допустим, у меня есть такое значение, как, Имя = Тестовый пользователь 1 и Страна = США, как я могу эффективно проверить, существуют ли уже эти значения в приведенной выше таблице?
Я пробовал подход, но он очень медленный с большими данными в таблице,
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 для проверки наличия соответствующей комбинации имени / страны с таким же идентификатором в приведенной выше таблице? Заранее спасибо.
@DaniDev Да, имя и страна. Могут быть и другие поля, но нам нужно сопоставить только 2 поля.
"Есть ли какой-нибудь простой способ с помощью C# Linq проверить, существует ли уже совпадающая комбинация имени / страны с таким же идентификатором в приведенной выше таблице?" да, вам нужно сгруппировать их по столбцам и проверить, нет ли какой-либо группировки, содержащей более одной записи. Это общий подход
@MongZhu, не могли бы вы дать указания, как выполнить группировку этих данных?
да, я нашел дубликат, который показывает, как находить дубликаты;)
@MongZhu, я не уверен, что мой вопрос дублируется. В моем случае данные другие. И, как я уже упоминал в вопросе, комбинация имени / страны с тем же идентификатором считается совпадением.
Попробуйте вот так. var l = records.SelectMany(x => x.UserDetails); var y = l.Where(x => x.ColName.Equals("Name") && !string.IsNullOrEmpty(x.Value) && x.Value.Equals(userName)).Join(l.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() вместо .Any(), если хотите получить полный список. .Any() просто вернет true/false в зависимости от того, найдено совпадение или нет.
@Karan, спасибо за образец кода. Дай-ка попробую и обновлю статус.





Сколько «полей» должно совпадать, чтобы считаться дубликатом. Название очевидно, но какие еще поля? это просто «страна»?