Требуется уникальный набор результатов TSQL, но я получаю повторяющиеся значения - PullRequest
1 голос
/ 19 марта 2012

следующий код по какой-то причудливой причине дает мне значение для каждой строки в таблице. Я просто хочу уникальные значения:

public IQueryable<WasteIndicatorItem> FindAllEWC()
{

    var results = (from x in this._db.WasteIndicatorItems
                   orderby x.EWC
                   select x).ToList();



    return results.OrderBy(s => s.EWC).Distinct().AsQueryable();
}

Я пытался переместить .Distinct () повсюду, до ETC ToList. Что я делаю не так, должно быть что-то простое, ура для чтения ..

Итак, в моих результатах я получаю:

13
13
13
12345
12345

вместо:

13
12345

ТАБЛИЦА СТРУКТУРЫ:

CREATE TABLE [dbo].[WasteIndicatorItem](
    [WasteIndicatorItemId] [int] IDENTITY(1,1) NOT NULL,
    [WasteId] [int] NOT NULL,
    [WasteIndicatorId] [int] NOT NULL,
    [EWC] [varchar](6) COLLATE Latin1_General_CI_AS NOT NULL,
    [WasteHazardCodeId] [int] NOT NULL,
    [Quantity] [money] NOT NULL,
    [Notes] [varchar](4000) COLLATE Latin1_General_CI_AS NULL,
    [EnteredById] [int] NOT NULL,
    [Entered] [datetime] NOT NULL,
    [LastModifiedById] [int] NULL,
    [LastModified] [datetime] NULL,
 CONSTRAINT [PK_IndicatorItem] PRIMARY KEY CLUSTERED 
(
    [WasteIndicatorItemId] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

Ответы [ 4 ]

1 голос
/ 19 марта 2012

Linq Distinct () на самом деле ведет себя не так, как вы могли ожидать .

Вам необходимо создать средство сравнения на равенство и использовать его в Union или Distinct ( см. Здесь )

Или, возможно, попробуйте DistinctBy из библиотеки MoreLinq

1 голос
/ 19 марта 2012

Вы используете Distinct to List, но не EF DBSet. Конечно, каждая запись в List будет уникальной, если вы не определили реализацию IEquatable. Поэтому, если вы хотите отбросить дубликаты на стороне клиента, вы должны реализовать IEquatable для объектов данных или использовать группирование в запросе.

0 голосов
/ 19 марта 2012

У вас есть два варианта:

  1. Используйте GroupBy и держите все на стороне SQL (предпочтительно).Вы бы сгруппировались по интересующему вас свойству, которое определяет уникальность для вас.
  2. Используйте AsEnumerable, чтобы разрушить все, а затем используйте перегруженный Distinct метод , который принимает IEqualityComparer.Обычно это не очень хорошая идея (если только набор результатов не мал), поскольку возвращаются все совпадающие результаты и выполняется меньше обработки на стороне SQL.

Реализация первого решения выглядит следующим образом:

var results = _db.WasteIndicatorItems
                 .OrderBy(x => x.EWC)
                 .GroupBy(x => x.EWC)
                 .Select(x => x.First());
0 голосов
/ 19 марта 2012

Что вы ожидаете, что элементы будут отличаться? По умолчанию - при условии, что вы выполняете вызов Distinct() перед материализацией результатов и возвращаетесь к Linq to Objects с помощью ToList() - я бы предположил, что Entity Framework будет смотреть на WasteIndicatorItemId, который является вашим первичным ключом, и по определению будет уникальным , поэтому ваш вызов Distinct ничего не изменит (и может даже оптимизировать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...