Запрос linq Take() имеет приоритет над Distinct()?

Мне нужно выбрать отдельные 1000 записей, используя LINQ. Но когда я вижу, что запрос сгенерирован, он принимает 1000 записей и отличается от этого результата.

IQueryable<testclass> resultSet = (from w in ......).Distinct().Take(1000);
</testclass>

где мой TestClass будет похож,

public TestClass
{
public string TestPRop { get; set; }
 //..has some 20 properties
}

Любой способ решить эту проблему, чтобы получить отличную привязку к набору результатов, а затем взять 1000 из отдельного набора результатов?

3 ответа

Отличие будет обработано до принятия. Двойная проверка вашего отличия выполняется правильно. Вот рабочий пример:

var dataset = new int[]
{
 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10
};
var query = from o in dataset select o;
var result = query.Distinct().Take(6);
// result = `1,2,3,4,5,6`

Я подозреваю, что ваша проблема связана с использованием SQL. Если это так, вы также можете использовать группировку для получения желаемого результата.

var distinctById = from o in query
 group o by o.Id into uniqueIds
 select uniqueIds.FirstOrDefault();


Вы принимаете только 1000 записей, а затем применяете отличные от этих 1000 записей с кодом, даже если вы делаете разные() перед Take().

Лучший способ добиться этого - получить 1000 отдельных записей непосредственно из вашего SQL-запроса, а не из кода I.E

string queryString = "SELECT top 1000 from (select distinct ... from table)";


вы можете использовать вложенные запросы linq

IQueryable<testclass> resultSet = from x in ((from w in ......).Distinct()).Take(1000);
</testclass>

licensed under cc by-sa 3.0 with attribution.