Как Вы сделали бы “не в” запросе с LINQ?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

291
задан Peter Mortensen 6 March 2015 в 10:25
поделиться

10 ответов

Я не знаю, поможет ли это Вам, но..

NorthwindDataContext dc = new NorthwindDataContext();    
dc.Log = Console.Out;

var query =    
    from c in dc.Customers    
    where !(from o in dc.Orders    
            select o.CustomerID)    
           .Contains(c.CustomerID)    
    select c;

foreach (var c in query) Console.WriteLine( c );

от НЕ В пункте в LINQ к SQL Marco Russo

288
ответ дан Robert Paulson 23 November 2019 в 01:40
поделиться

Пример с помощью Списка интервала для простоты.

List<int> list1 = new List<int>();
// fill data
List<int> list2 = new List<int>();
// fill data

var results = from i in list1
              where !list2.Contains(i)
              select i;

foreach (var result in results)
    Console.WriteLine(result.ToString());
1
ответ дан Inisheer 23 November 2019 в 01:40
поделиться

В то время как Except часть ответа, это не целый ответ. По умолчанию, Except (как несколько из операторов LINQ) делает ссылочное сравнение на ссылочных типах. Для сравнения значениями в объектах Вы будете иметь к

  • реализация IEquatable<T> в Вашем типе, или
  • переопределение Equals и GetHashCode в Вашем типе, или
  • передача в экземпляре типа, реализовывая IEqualityComparer<T> для Вашего типа
2
ответ дан Ryan Lundy 23 November 2019 в 01:40
поделиться

объекты в первом списке, где электронная почта не существует во втором списке.

from item1 in List1
where !(list2.Any(item2 => item2.Email == item1.Email))
select item1;
58
ответ дан Amy B 23 November 2019 в 01:40
поделиться

Вы хотите оператор Except.

var answer = list1.Except(list2);

Лучшее объяснение здесь: http://blogs.msdn.com/charlie/archive/2008/07/12/the-linq-set-operators.aspx

ПРИМЕЧАНИЕ: Эта техника работает лучше всего на типы примитивов только, так как необходимо реализовать IEqualityComparer для использования Кроме метода с составными типами.

321
ответ дан Eugene 23 November 2019 в 01:40
поделиться
var secondEmails = (from item in list2
                    select new { Email = item.Email }
                   ).ToList();

var matches = from item in list1
              where !secondEmails.Contains(item.Email)
              select new {Email = item.Email};
3
ответ дан tvanfosson 23 November 2019 в 01:40
поделиться

Кроме того, можно сделать как это:

var result = list1.Where(p => list2.All(x => x.Id != p.Id));
0
ответ дан 23 November 2019 в 01:40
поделиться

Для людей, которые начинают с группы объектов в памяти и выполняют запрос к базе данных, я обнаружил, что это лучший способ:

var itemIds = inMemoryList.Select(x => x.Id).ToArray();
var otherObjects = context.ItemList.Where(x => !itemIds.Contains(x.Id));

Это дает хороший WHERE ... IN (...)предложение в SQL.

60
ответ дан 23 November 2019 в 01:40
поделиться

В случае использования ADO.NET Entity Framework решение EchoStorm также отлично работает. Но мне потребовалось несколько минут, чтобы осмыслить это. Предполагая, что у вас есть контекст базы данных, dc, и вы хотите найти строки в таблице x, не связанные в таблице y, полный ответ-ответ будет выглядеть так:

var linked =
  from x in dc.X
  from y in dc.Y
  where x.MyProperty == y.MyProperty
  select x;
var notLinked =
  dc.X.Except(linked);

В ответ на комментарий Энди, да, в запросе LINQ может быть два от. . Вот полный рабочий пример со списками. У каждого класса, Foo и Bar, есть идентификатор. Foo имеет ссылку на «внешний ключ» на Bar через Foo.BarId. Программа выбирает все Foo, не связанные с соответствующим Bar.

class Program
{
    static void Main(string[] args)
    {
        // Creates some foos
        List<Foo> fooList = new List<Foo>();
        fooList.Add(new Foo { Id = 1, BarId = 11 });
        fooList.Add(new Foo { Id = 2, BarId = 12 });
        fooList.Add(new Foo { Id = 3, BarId = 13 });
        fooList.Add(new Foo { Id = 4, BarId = 14 });
        fooList.Add(new Foo { Id = 5, BarId = -1 });
        fooList.Add(new Foo { Id = 6, BarId = -1 });
        fooList.Add(new Foo { Id = 7, BarId = -1 });

        // Create some bars
        List<Bar> barList = new List<Bar>();
        barList.Add(new Bar { Id = 11 });
        barList.Add(new Bar { Id = 12 });
        barList.Add(new Bar { Id = 13 });
        barList.Add(new Bar { Id = 14 });
        barList.Add(new Bar { Id = 15 });
        barList.Add(new Bar { Id = 16 });
        barList.Add(new Bar { Id = 17 });

        var linked = from foo in fooList
                     from bar in barList
                     where foo.BarId == bar.Id
                     select foo;
        var notLinked = fooList.Except(linked);
        foreach (Foo item in notLinked)
        {
            Console.WriteLine(
                String.Format(
                "Foo.Id: {0} | Bar.Id: {1}",
                item.Id, item.BarId));
        }
        Console.WriteLine("Any key to continue...");
        Console.ReadKey();
    }
}

class Foo
{
    public int Id { get; set; }
    public int BarId { get; set; }
}

class Bar
{
    public int Id { get; set; }
}
7
ответ дан 23 November 2019 в 01:40
поделиться

Спасибо, Бретт. Ваше предложение помогло и мне. У меня был список объектов, и я хотел отфильтровать его, используя другой список объектов. Спасибо еще раз....

Если кому-то нужно, пожалуйста, посмотрите на мой пример кода:

'First, get all the items present in the local branch database
Dim _AllItems As List(Of LocalItem) = getAllItemsAtBranch(BranchId, RecordState.All)

'Then get the Item Mappings Present for the branch
Dim _adpt As New gItem_BranchesTableAdapter
Dim dt As New ds_CA_HO.gItem_BranchesDataTable
    _adpt.FillBranchMappings(dt, BranchId)

Dim _MappedItems As List(Of LocalItem) = (From _item As LocalItem In _AllItems Join _
    dr As ds_CA_HO.gItem_BranchesRow In dt _
    On _item.Id Equals dr.numItemID _
    Select _item).ToList

_AllItems = _AllItems.Except(_MappedItems.AsEnumerable).ToList

 Return _AllItems
0
ответ дан 23 November 2019 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: