2015-06-25 3 views
4

Использование Entity Framework Version = 6.0.0.0 для получения общего идентификатора и заказа, как показано ниже.невозможно создать постоянное значение типа типа анонимного типа только примитивные типы

var dt1 = from p in dt.AsEnumerable() 
      select new 
      { 
       Id = p.Field<int>("Id"), 
       OrderId = p.Field<int>("OrderId") 
      }; 

var dt2 = (from order in db.Orders 
      select new 
      { 
       order.Id, 
       order.OrderId 
      }).ToList(); 
var intersect = dt1.Intersect(dt2); 

На основании перечня значений в пересечении. Мне нужно выбрать все значения из таблицы заказов.

Попытка используемого код получает ошибку «не удалось создать постоянное значение типа анонимного типа только примитивных типов»

var result= (from a in sync.Orders 
       where intersect.Any(b => a.Id == b.Id && a.OrderId == b.OrderId) 
       select a).ToList(); 
+0

Это LINQ to SQL, EF, что-то еще? –

+0

с использованием Entity Framework. –

+0

Пожалуйста, включите, что в вопросе тогда - идеально с информацией о версии EF. –

ответ

10

Вы пытаетесь «присоединиться» запрос EF с набором данных в оперативной памяти, который не работает, потому что нет возможности встраивать список и поиск в SQL. Один из вариантов, чтобы вытащить всю таблицу в память с AsEnumerable:

var result= (from a in sync.Orders.AsEnumberable 
       where intersect.Any(b => a.Id == b.Id && a.OrderId == b.OrderId) 
       select a).ToList(); 

Другой вариант заключается в сцепить Id и OrderId в одно значение и использовать Contains так, что может быть переведено на IN пункта в SQL:

var lookup = intersect.Select(i => i.Id + "-" + i.OrderId).ToList(); 

var result= (from a in sync.Orders 
       where lookup.Contains(a.Id + "-" + a.OrderId) 
       select a).ToList(); 
+0

спасибо !! D Стэнли работает второй вариант. –

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