2012-05-11 5 views
1

Идти орехи над этим.Не работает LINQ не в запросе «содержит»

Простой запрос, но его просто не работает. Мне просто нужно получить подразделения компании, которые в настоящее время не назначены никому.

ID - тип GUID.

При отладке я вижу, что в companyUnits есть 2 объекта и 1 в userCompanyUnits. Я пытаюсь получить это 1 companyUnit (которого нет в userCompanyunit), чтобы показать. Вместо этого я не получаю никаких результатов.

Любая идея, что не так в запросе? Может быть, я не могу сравнивать на основе указаний?

var companyUnitsList = from x in companyUnits 
         where !(from c in userCompanyUnits 
           select c.CompanyUnit.Id).Contains(x.Id) 
         select x; 

Заранее благодарен!

+1

Ваш синтаксис выглядит точно. Можете ли вы запустить профилировщик, чтобы узнать, какой запрос sql создается? –

+1

Попробуйте вместо этого использовать оператор Except: http://stackoverflow.com/a/183812/138938 –

+0

Спасибо. Я все еще не знаю, почему мой и метод Except не работают для меня, но я просто добавил новый метод linq в свою библиотеку знаний. Спасибо за это. – Shenaniganz

ответ

1

Вот способ сделать это без использования, кроме оператора и необходимости пользовательского IEqualityComparer:

 List<Tuple<int, string>> allUnits = new List<Tuple<int, string>>(); 
     allUnits.Add(new Tuple<int, string>(1, "unit1")); 
     allUnits.Add(new Tuple<int, string>(2, "unit2")); 
     allUnits.Add(new Tuple<int, string>(3, "unit3")); 

     List<Tuple<int, string>> assignedUnits = new List<Tuple<int, string>>(); 
     assignedUnits.Add(new Tuple<int, string>(2, "unit2")); 

     var unassigned = allUnits.Where(m => !assignedUnits.Any(asgn => asgn.Item1 == m.Item1)); 

//Yields unit1 and unit3 
  • Элемент1 соответствует Unit.ID
+0

Все большие ответы, но это тот, который действительно работал. Спасибо! – Shenaniganz

1

Поскольку вы его помечена как SQL , Я предполагаю, что это запрос и работает с базой данных. В зависимости от ОРМ и является ли вы навигационные свойства, определенные и годным к употреблению, вы можете сделать:

var notAssigned = 
    from x in companyUnits 
    where x.Users.Any() == false 
    select x; 

IOW, независимо от навигации собственности или коллекции существует, чтобы связать узел компании с назначенным пользователем (ами) является то, что вы будете использовать в запросе (и, скорее всего, перевести на sql 'exists')

+0

Интересный подход, спасибо. Однако это не работает с моим конкретным сценарием. – Shenaniganz

+0

Вы всегда можете сделать запрос для тех, которые назначены пользователям, а затем сделать все. Кроме (areAssigned) –

1
var list1 = from s in new String[] {"ABC1","ABC2", "ABC3", "ABC4"} select new {Field1=s,Id = Guid.NewGuid().ToString()} ; 
    var list2 = new String[] {"ABC3","ABC4", "ABC5", "ABC6"} ; 


    var requiredList = (from i1 in list1 
        from i2 in list2 
        where !i1.Field1.Contains(i2) 
        select i1).Distinct(); 
+0

В методе where в поле отсутствует метод методов Contains. – Shenaniganz

Смежные вопросы