Попытка получить первую запись для каждого MemID в этом запросе LINQ

#c# #sql-server #linq

#c# #sql-сервер #linq

Вопрос:

У меня есть запрос LINQ, который работает, как показано ниже. Единственная проблема в том, что иногда я получаю повторяющиеся MEMID. Как я могу получить только первый MemID из этого запроса за один переход к базе данных?Я использую SQL Server 2008 R2 в качестве своей серверной базы данных и C # в качестве языка программирования.

 var query = (from m in e.Memberships
             where m.MEMID != null 
                  amp;amp; (SqlFunctions.StringConvert((double)m.MEMID).Contains(memIdOrName) 
                        || m.NAME.Contains(memIdOrName))  
             select new { 
                             m.MEMID, 
                             NAME = m.NAME.TrimEnd(), 
                             m.CITY, 
                             m.STATE, 
                             m.SYSTEMID, 
                             SYSTEMNAME = m.SYSTEMNAME.TrimEnd() 
                        })
                        .Distinct()
                        .OrderBy(s => s.NAME)
                        .ThenBy(s => s.CompanyID)
                        .ThenBy(s => s.CITY)
                        .ThenBy(s => s.MEMID);

var a = query.Skip(startRowIndex).Take(maximumRows).ToList();
 

Ответ №1:

Сгруппируйте это значение, а затем выберите только один элемент из этой группы. Если вам все равно, какой, вы можете просто взять первый. Если вам нужна конкретная запись, вы можете изменить их порядок, прежде чем брать первый элемент.

Поэтому замените Distinct на;

 //everything before `Distinct`
.GroupBy(s => s.MEMID)
.Select(group => group.FirstOrDefault())//or some other query to get one item in the group
//rest of your query
 

Комментарии:

1. ОК. Я постараюсь и дам вам знать. Спасибо.

2. В зависимости от базового поставщика запросов, вероятно, вам нужно будет использовать .FirstOrDefault() вместо .First()

3. Это работает. НО производительность сейчас очень низкая. Раньше это было быстро и почти мгновенно.

4. @Sunil Ну, это делает что-то радикально другое. Скорость выполнения чего-либо не имеет значения, если это на самом деле не работает .

5. @Sevy, да, это правда. Один вопрос: запрос выполняет группировку на стороне базы данных или на стороне кода?