У меня есть очень специфический запрос LINQ. Я хотел бы проверить наличие случайно сгенерированного ключа в таблице.Выражение Linq для выбора поля
Стандартный запрос может быть определен как Select * from Products where SaleId == 'XXXXXXX'
. В этом запросе XXXXXX генерируется генератором случайных символов (также предусмотрена длина). Я создал следующий LINQ расширение:
public static string GetUniqueId<T, TProperty>(this IEnumerable<T> source, int length, Func<T, TProperty> idProperty)
{
bool isUnique = false;
string uniqueId = String.Empty;
while (!isUnique)
{
uniqueId = PasswordGenerator.GenerateNoSpecialCharacters(length);
if (!String.IsNullOrEmpty(uniqueId))
{
isUnique = source.AsQueryable().SingleOrDefault(i => idProperty(i).Equals(uniqueId)) == null;
}
}
return uniqueId;
}
Однако я заметил, что этот метод сначала выбирает все записи из таблицы, который передается в качестве источника, а затем запускает ИНЕК. Такое поведение, очевидно, занимает много времени. Так что в основном это делает SELECT * FROM Products
, а затем запускает SingleOrDefault
Есть ли способ, которым я мог бы непосредственно выполнить запрос таким образом, что он делает Select * из продуктов WHERE Id = «XXXXXXX»
Вот пример того, как я его называю :
string id = c.L2SOnlineCountMasters.GetUniqueId(9, x => x.MID);
в этом случае L2SOnlineCountMasters представляет собой таблицу, в Databse и с представляет собой экземпляр DataContext.
В надежде, что на это будет дан ответ!
Cheerz, Anup
У кого-нибудь есть хорошие указатели на выражения? Оказывается, мои понятия немного нечеткие и, к сожалению, я не могу найти хорошую (и я имею в виду хорошую) документацию по основным принципам выражений, функций и т. Д. –
Ваш код выглядит отлично. Обратите внимание, что вы можете сделать это намного быстрее путем кэширования 'typeof (string) .GetMethod (« Equals », new [] {typeof (string)})' в статическом поле. – SLaks