2013-05-14 2 views
-3

У меня проблема с моим запросом. У меня есть два простых класса. Скажем,Использование метода Contains внутри linq's where.

public class A{ 
    public List<B> MyCollection{get; set;} 
} 
public class B{ 
public string Id; 
} 
//I want to do something like that 
var myB = new B{Id="1"}; 
context.A.Where(x=> x.MyCollection.Contains(myB)).ToList(); 

Как это решить? Я знаю, что я мог бы сделать что-то вроде

context.A.ToList().Where... 

, но это не хорошая идея, особенно, что у меня есть несколько тысяч записей.

ОБНОВЛЕНИЕ! контекст является контекстом EntityFramework и context.A представляет DbSet Я все еще получаю ошибку «LINQ к Entities не распознает метод«Boolean Содержит» также я не могу использовать

context.A.ToList().Where(.... 

, потому что у меня есть тысячи записей, и это будет неэффективной

+0

'context.A.Where (х => x.MyCollection.Contains (myB)) ', если я не понимаю проблему? – Matthew

+2

В чем вопрос? – Bobson

+0

Ну, проблема в том, что я не мог попасть в этот список, поскольку «LINQ to Entities не распознает метод Boolean Contains ...». – 7h4ro3

ответ

0

вы пробовали это

context.A.MyCollection.Where(x= > x.Id == myB.Id).ToList(); 
+0

класс A не имеет поля Id – 7h4ro3

+0

отлично, забыл написать MyCollection :) –

1
var ans = from b in context.A.MyCollection 
      where b.Id == 1 
      select b; 

или

var ans = context.A.MyCollection.Where(b => b.Id == 1); 
+0

Просто, чтобы быть ясным. A не имеет поля «Id». Мне нужно получить из контекста базы данных. Элементы, которые имеют в своем поле «MyCollection» указанный элемент B – 7h4ro3

2

Это работает для меня:

public class A 
{ 
    public List<B> MyCollection{get; set;} 
} 

public class B 
{ 
    public string Id; 
} 

void Main() 
{ 

    // this is what you're searching for 
    var myB = new B{Id="1"}; 


    // here are some A objects to put in your collection 
    A a1 = new A(); 
    a1.MyCollection = new List<B>(); 
    A a2 = new A(); 
    a2.MyCollection = new List<B> { myB }; 
    A a3 = new A(); 
    a3.MyCollection = new List<B> { new B {Id="1"}}; 


    // here's a List that represents your context.A 
    List<A> contextA = new List<A> {a1, a2, a3}; 


    // here's your actual search. results has a count of 1 
    var results = contextA.Where(x=> x.MyCollection.Contains(myB)); 
    Console.WriteLine(results.Count()); 
} 

Обратите внимание, что это только находит a2, потому что вы в буквальном смысле поставить объект "Myb" там. Он не находит a3, который представляет собой новый объект, созданный с тем же идентификатором.

Если вы хотите, чтобы найти как a2 и a3, вы, вероятно, хотите изменить Где-то вроде этого:

var results = contextA.Where(x=> x.MyCollection.Any(b => b.Id == myB.Id)); 
+0

Это работает, потому что вы работаете с List.Извините, я не упоминал, что я работаю над DbSet. «LINQ to Entities не распознает ошибку« Boolean Contains »метода – 7h4ro3

+3

@ 7h4ro3: последняя строка в сообщении Лили - правильный ответ. Использование 'Contains' для вашего запроса неверно и' Any' является правильным способом. «Содержит» выполняет сравнение по идентификатору объекта, но EF и база данных управляют идентификацией с помощью ключа, поэтому вам нужно использовать свойство ключа ('Id') для сравнения. – Slauma

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