У меня есть коллекция анонимных объектов, созданные, как это:Эффективного LINQ содержит с анонимным типом
var srcCategories = srcSet.Categories.Select(c => new
{
ApplicationId = c.IsGLobal ? (long?)null : c.App.Id,
c.Name
});
Обратите внимание, что эта коллекция делает не приходят из моего контекста данных; он генерируется при вводе внешней системы. Мне нужно нанести на карту обаApplicationId
и Name
с объектами в моей базе данных. До сих пор это единственный способ, которым я был в состоянии успешно сделать его работу:
var trgCategoryIds =
(from c in core.Domain.Categories.AsEnumerable()
let ci = new { c.ApplicationId, c.Name }
where srcCategories.Contains(ci)
select c.Id)
.ToArray();
Но это требует от меня, чтобы вытащить всю Categories
таблицы в память первой. Я ищу более эффективный способ сделать это, желательно в одном запросе. Я пробовал все из следующих вариантов, ни один из них не может быть преобразован в SQL:
// Removed .AsEnumerable()
var trgCategoryIds =
(from c in core.Domain.Categories
let ci = new { c.ApplicationId, c.Name }
where srcCategories.Contains(ci)
select c.Id)
.ToArray();
// Use .Any() instead of .Contains()
var trgCategoryIds =
(from c in core.Domain.Categories
where srcCategories.Any(s => s.ApplicationId == c.ApplicationId && s.Name == s.Name)
select c.Id)
.ToArray();
// Use Tuples instead of anon types
var srcCategories = srcSet.Categories.Select(c => Tuple.Create(...));
var trgCategoryIds =
(from c in core.Domain.Categories
let ci = Tuple.Create(c.ApplicationId, c.Name)
where srcCategories.Contains(ci)
select c.Id)
.ToArray();
Являются ли эти две разные базы данных, или одна база данных? Являются ли коллекции '' '' '' '' те же 'DataContext'? – Servy
@Servy Нет, 'srcCategories' происходит от ввода из внешней системы - в частности, веб-служба предоставляет список категорий, которые затем отфильтровываются на основе параметров командной строки. –
Хорошо, если два IQueryables поступают из разных источников, как бы вы ожидали избежать того, чтобы вытащить один из двух наборов данных в память? Они почти наверняка не узнают, как разговаривать друг с другом. – Servy