Ответ 1
Эта строка относится ко мне и является общей ошибкой людей, использующих EF:
Table.ToList().Where(x => email.EndsWith(x.Name));
Часть Table.ToList()
является наихудшей частью, потому что это фактически материализует целую таблицу в памяти, а затем выполняет EndsWith
в С#.
Эта строка:
Table.Where(x => email.EndsWith(x.Name));
Я бы предостерег этот подход только по общему принципу, поскольку он будет ужасно медленным, когда таблица вырастет до разумного размера. Вы можете сделать тяжелую работу до того, как запрос попадет в базу данных, разделив домен с электронной почтой при построении запроса:
var email = "[email protected]";
/* You should null check this of course and not just assume a match was found */
var domain = Regex.Match(email , "@(.*)").Groups[1].Value;
/* Note: ToList() materialisation happens at the end */
var result = Table.Where(x => x.Name == domain).ToList();
Кроме того, если вам нужно сопоставить имена доменов, хранящие электронные письма, то мой предпочтительный подход состоял бы в том, чтобы разделить электронное письмо и сохранить доменное имя в отдельном столбце, который вы индексируете и просто сопоставляете, это будет масштабироваться и быть намного проще в управлении. Помните, что данные в эти дни дешевы... особенно по сравнению с неиндексируемыми сканами таблиц.
Также помните (для обоих сценариев), что ваша база данных установлена на CI (без учета регистра)