C # Как использовать & ldquo; не в & rdquo; в LINQ [дубликат]

Вот некоторые подходы к работе с асинхронными запросами:
  1. Объект обезьяны браузера
  2. Q - A
  3. A + Promises.js
  4. jQuery отложен
  5. API XMLHttpRequest
  6. Использование концепции обратного вызова - как реализация в первом ответе

Пример: jQuery отложенная реализация для работы с несколькими запросами

var App = App || {};

App = {
    getDataFromServer: function(){

      var self = this,
                 deferred = $.Deferred(),
                 requests = [];

      requests.push($.getJSON('request/ajax/url/1'));
      requests.push($.getJSON('request/ajax/url/2'));

      $.when.apply(jQuery, requests).done(function(xhrResponse) {
        return deferred.resolve(xhrResponse.result);
      });
      return deferred;
    },

    init: function(){

        this.getDataFromServer().done(_.bind(function(resp1, resp2) {

           // Do the operations which you wanted to do when you
           // get a response from Ajax, for example, log response.
        }, this));
    }
};
App.init();
266
задан Peter Mortensen 6 March 2015 в 21:25
поделиться

11 ответов

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

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 );

from Предложение NOT IN в LINQ to SQL by Марко Руссо

261
ответ дан Robert Paulson 24 August 2018 в 05:24
поделиться

в первом списке, где E-mail не существует во втором списке.

from item1 in List1
where !(list2.Any(item2 => item2.Email == item1.Email))
select item1;
56
ответ дан Amy B 24 August 2018 в 05:24
поделиться

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

var answer = list1.Except(list2);

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

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

296
ответ дан Eugene 24 August 2018 в 05:24
поделиться

Пример с использованием списка int для простоты.

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 24 August 2018 в 05:24
поделиться

Можно также использовать All()

var notInList = list1.Where(p => list2.All(p2 => p2.Email != p.Email));
1
ответ дан Janis S. 24 August 2018 в 05:24
поделиться

Не могли бы вы выполнить внешнее соединение, только выбрав элементы из первого списка, если группа пуста? Что-то вроде:

Dim result = (From a In list1
              Group Join b In list2 
                  On a.Value Equals b.Value 
                  Into grp = Group
              Where Not grp.Any
              Select a)

Я не уверен, что это будет эффективно работать с инфраструктурой Entity.

0
ответ дан Marten Jacobs 24 August 2018 в 05:24
поделиться

Для любого, кто также хочет использовать SQL-подобный IN оператор в C #, загрузите этот пакет:

Mshwf.NiceLinq

It имеет методы In и NotIn:

var result = list1.In(x => x.Email, list2.Select(z => z.Email));

Даже вы можете использовать его таким образом

var result = list1.In(x => x.Email, "a@b.com", "b@c.com", "c@d.com");
1
ответ дан mshwf 24 August 2018 в 05:24
поделиться

Я не тестировал это с помощью LINQ & nbsp; to & nbsp; Entities :

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

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

Альтернативно:

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

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

foreach (var c in query) 
    Console.WriteLine( c );
11
ответ дан Peter Mortensen 24 August 2018 в 05:24
поделиться

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

  • реализовать IEquatable<T> в вашем типе, или
  • переопределить Equals и GetHashCode в вашем типе , или
  • проходят в экземпляре реализации типа IEqualityComparer<T> для вашего типа
2
ответ дан Ryan Lundy 24 August 2018 в 05:24
поделиться

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

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

Это создает приятный WHERE ... IN (...) в SQL.

54
ответ дан StriplingWarrior 24 August 2018 в 05:24
поделиться
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 24 August 2018 в 05:24
поделиться
Другие вопросы по тегам:

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