2010-10-25 3 views
2

Я хочу вернуть одну строку из таблицы пользователей с помощью учетной записи домена идентификатор в качестве основного и уникальный ключLINQ SingleOrDefault

Однако, когда я использую SingleOrDefault и увидеть его SQL перевод выполняет весь выбор * от пользователей

мой запрос ..

var user = base.SingleorDefault(t=>t.domainaccountid) 

Я хочу, чтобы это вернуло всего один ряд!

+0

Старый вопрос, но 'SingleOrDefault' должен запрашивать всю таблицу, потому что он должен проверять наличие одного элемента. – wes

ответ

1

Вы можете попробовать Where вместе с FirstOrDefault:

var user = base.Where(t => t.domainaccountid == 123).FirstOrDefault(); 
+0

SingleorDefault (pred) по-прежнему выполняет 'WHERE', поэтому я не думаю, что это напрямую связано (хотя' 'FirstOrDefault' может быть желательным для поведения' TOP 1') –

4

base Что такое? Возможно ли, что вы ввели его в IEnumerable<T> в какой-то момент, а не IQueryable<T>? , что вызовет это. Обратите внимание, что состав базы данных возможен только при использовании IQueryable<T>, поэтому, если какой-либо из ваших методов вернет что-то , то другой, чем это, композиция закончится.

0

Попробуйте

var user = base.SingleorDefault(t=>t.domainaccountid==123); 
+0

Добро пожаловать в stackoverflow! Всегда лучше дать краткое описание примера кода, чтобы улучшить точность сообщения :) –

0

SingleOrDefault ищет уникальные записи, он должен делать:

SELECT TOP 2 * FROM TABLE 

Он делает это так, что если он находит 2 результатов он будет бросать исключение, поскольку это не является уникальным ,

Если вам не нужно находить его как уникальный объект, так как у вас есть другие меры для предотвращения дублирования; или просто не волнует, вы можете использовать FirstOrDefault следующим образом:

array.FirstOrDefault(x => x.id == someOtherId); 

Это будет выполнять следующие действия:

SELECT TOP 1 * FROM TABLE 

Это позволит получить результаты быстрее, особенно в больших таблицах, так как это будет как только будет найден первый результат.

Смежные вопросы