2015-04-11 2 views
1

Я хочу сравнить два списка объектов на основе их свойств с помощью LINQ. Я создал список объектов, а другой список хранится в базе данных. Классы являются следующие:Сравните два списка объектов в where, где предложение LINQ

class A 
{ 
    int a1; 
    int a2; 
} 
class B 
{ 
    int b1; 
    int b2; 
} 

Я сравниваю List<A> a к List<B> b с использованием условий (a1==b1 and a2==b2) или (a1==b2 and a2==b1). если какое-либо условие вернется, оно возвращает треть List<C> со свойствами class A. Вот следующий LINQ Я использую:

(from a in context.A 
       where b.Any(m => (m.b1 == a.a1 && m.b2 == a.a2) || (m.b1 == a.a2 && m.b2 == a.a1)) 
       select new C 
       { 
        c1 = a.a1, 
        c2 = a.a2, 
       }).ToList(); 

Но его бросали ошибки, как:

Локальная последовательность не может быть использована в LINQ для реализации SQL запроса операторов, за исключением Содержит оператор

, пожалуйста, помогите мне выяснить правильный запрос Linq.

+0

Вы пробовали делать, как предложено? Использовать операцию Содержит? –

+0

Я пробовал операцию «Содержит», но не смог выяснить, как я могу использовать ее для указанного условия. – Vivek

ответ

2

Попробуйте это:

(
    from a in context.A.ToArray() 
    where b.Any(m => (m.b1 == a.a1 && m.b2 == a.a2) || (m.b1 == a.a2 && m.b2 == a.a1)) 
    select new C 
    { 
     c1 = a.a1, 
     c2 = a.a2, 
    } 
).ToList(); 

Это приносит A местный, который затем позволяет использовать b, который также местные.

Конечно, это работает только в том случае, если A достаточно мал, чтобы быть полностью загруженным в память первым.

+0

он работает. Благодарю. Но что, если 'List ' содержит большое количество объектов? – Vivek

+0

@ Энигматичность Это не только то, что она может поместиться в памяти, но и проблема с производительностью. Фильтрация серверной части будет намного быстрее для больших. Как –

1

Попробуйте как этот

context.A.Where(a=>b.Any(m => (m.b1 == a.a1 && m.b2 == a.a2) || (m.b1 == a.a2 && m.b2 == a.a1))).select(a=> new C{ c1 = a.a1, 
        c2 = a.a2}); 
+0

B не является частью 'DBContext'. Он создан мной. – Vivek

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