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();
Я не знаю, поможет ли это вам, но ..
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 );
в первом списке, где E-mail не существует во втором списке.
blockquote>from item1 in List1 where !(list2.Any(item2 => item2.Email == item1.Email)) select item1;
Вы хотите оператор Except.
var answer = list1.Except(list2);
Лучшее объяснение здесь: http://blogs.msdn.com/charlie/archive/2008/07/12/the-linq- set-operations.aspx
ПРИМЕЧАНИЕ. Этот метод лучше всего работает только для примитивных типов, так как вы должны реализовать IEqualityComparer , чтобы использовать метод Except со сложными типами.
Пример с использованием списка 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());
Можно также использовать All()
var notInList = list1.Where(p => list2.All(p2 => p2.Email != p.Email));
Не могли бы вы выполнить внешнее соединение, только выбрав элементы из первого списка, если группа пуста? Что-то вроде:
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.
Для любого, кто также хочет использовать SQL-подобный IN
оператор в C #, загрузите этот пакет:
Mshwf.NiceLinq
blockquote>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");
Я не тестировал это с помощью 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 );
Хотя Except
является частью ответа, это не весь ответ. По умолчанию Except
(как и некоторые из операторов LINQ) выполняет сравнительное сравнение ссылочных типов. Для сравнения значений в объектах вам нужно будет
IEquatable<T>
в вашем типе, или Equals
и GetHashCode
в вашем типе , или IEqualityComparer<T>
для вашего типа Для людей, которые начинают с группы объектов в памяти и обращаются к базе данных, я нашел, что это лучший способ:
var itemIds = inMemoryList.Select(x => x.Id).ToArray();
var otherObjects = context.ItemList.Where(x => !itemIds.Contains(x.Id));
Это создает приятный WHERE ... IN (...)
в SQL.
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};