Ответ, который вы дали, не дает вам то, о чем вы просили в вопросе. Вы сказали, что хотите поставщиков, у которых был тот или другой, но не оба.
Во-первых, если провайдер как он будет быть выбран этим кодом, так как первое условие истинно:
d.Domains.Any(n => n.Name == domain && domExists)
Во-вторых, если поставщик имеет улов-все, но не указанный домен , то будет не, если домен существует в различных провайдерах. Это происходит потому, что domExists
будет истинным, поэтому вторая проверка потерпит неудачу:
d.Domains.Any(n => n.Name == "*" && !domExists)
Я не вижу, как захватывая domExists
флаг может реально помочь вам. Однако я думаю, что начать с поиска всей коллекции доменов - это правильная идея. Вы можете попробовать это:
Во-первых, собрать все идентификаторы поставщиков для доменов, которые соответствуют либо «*», либо имя (я предполагаю, что домен должен иметь внешний ключ к IdentityProvider):
var providerIds =
db.Domains.Where(d => d.Name == domain || d.Name == "*")
.Select(d => d.IdentityProviderID)
.ToList();
Это сужает это вниз довольно много, и у нас есть способ фильтрации снова: есть поставщики, которые имеют как будут добавлены в список дважды, так что мы просто должны выбрать все идентификаторы, которые появляются только один раз:
var uniqueProviderIds =
providerIds.GroupBy(id => id)
.Where(g => g.Count() == 1)
.Select(g => g.Key)
.ToList();
даст вам ответ. Вы также можете использовать этот список для создания другого SQL-запроса, чтобы получить фактические объекты IdentityProvider, если они вам понадобятся:
db.IdentityProviders.Where(ip => uniqueProviderIds.Contains(ip.ID)).ToList()
Как выглядит «IdentityProvider»? Определение типа? Любой код, который вы уже пробовали ..? –
@RahulSingh Добавлено определение класса ... Я пробовал множество комбинаций, но ничего не работает в это время. – Jamie