Простой рекурсивный чек будет достаточно, и как можно раньше вернемся, мы предполагаем, что вход не является списком или содержит не-списки, он не пуст
def isEmpty(alist):
try:
for a in alist:
if not isEmpty(a):
return False
except:
# we will reach here if alist is not a iterator/list
return False
return True
alist = []
blist = [alist] # [[]]
clist = [alist, alist, alist] # [[], [], []]
dlist = [blist] # [[[]]]
elist = [1, isEmpty, dlist]
if isEmpty(alist):
print "alist is empty"
if isEmpty(dlist):
print "dlist is empty"
if not isEmpty(elist):
print "elist is not empty"
Вы можете еще больше его улучшить для проверки рекурсивного списка или отсутствия объектов списка, или может быть пустым dicts и т. д.
Я бы удалил виртуальные коллекции и объекты из всех трех классов, а затем удалил поле Id (при условии, что это первичный ключ) в таблице OrganisationLocations. Поля OrganisationId и LocationId в OrganisationLocations должны быть как первичными ключами, так и внешними ключами, чтобы сделать связь «многие ко многим» между OrganisationLocations, Locations и Organization. Затем вы можете использовать Linq, чтобы выполнить простой запрос на соединение, чтобы получить информацию, которую вы ищете. Например:
var orgs = (from ol in PfApiContext.OrganisationLocations
inner join o in PfApiContext.Organisation on o.Id equals ol.OrganisationId
inner join l in PfApiContext.Locations on ol.LocationId equals l.Id
where ol.LocationId = 1
select new Organisation()
{
Id = o.Id,
Name = o.Name,
Owner = o.Ower,
etc...
}