это создает и открывает новое соединение каждый раз?
Нет. Соединения кэшируются.
Должен ли я где-нибудь кешировать результаты
Нет. Не кэшируйте целые таблицы.
я должен сделать переменную TicDatabaseEntities статической и инициализировать ее на уровне класса?
Нет. Не сохраняйте экземпляр DataContext дольше, чем UnitOfWork.
Должен ли мой класс быть статическим, если он содержит только статические методы?
Конечно ... это не позволит никому создавать бесполезные экземпляры класса.
Также я заметил, что если я верну result.First () вместо FirstOrDefault () и запрос не найдет совпадение, он выдаст исключение
Таково поведение Первого. Поэтому я обычно ограничиваю использование First для IGroupings или для коллекций, ранее проверенных с помощью .Any ().
Я бы переписал ваш существующий метод как:
using (TicDatabaseEntities db = new TicDatabaseEntities())
{
bool result = db.Articles
.Any(a => a.supplierArticleID.Equals(supplierIdent));
return result;
}
Если вы вызываете метод в цикле, я бы переписал:
private static Dictionary<string, bool> TicArticleExists
(List<string> supplierIdents)
{
using (TicDatabaseEntities db = new TicDatabaseEntities())
{
HashSet<string> queryResult = new HashSet(db.Articles
.Where(a => supplierIdents.Contains(a.supplierArticleID))
.Select(a => a.supplierArticleID));
Dictionary<string, bool> result = supplierIdents
.ToDictionary(s => s, s => queryResult.Contains(s));
return result;
}
}