2015-04-02 3 views
1

У меня есть следующие классы:LINQ запрос с соединением с ICollection

public partial class Person : ModificationEntity 
{ 
    public Person() 
    { 
     this.PersonCompanies = new List<PersonCompany>(); 
    } 

    public System.Guid PersonId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 

    public virtual ICollection<PersonCompany> PersonCompanies { get; set; } 
} 

public partial class PersonCompany : ModificationEntity 
{ 
    public System.Guid PersonCompanyId { get; set; } 
    public System.Guid PersonId { get; set; } 
    public System.Guid CompanyId { get; set; } 

    public virtual Company Company { get; set; } 
    public virtual Person Person { get; set; } 
} 

мне нужно запросить все пользователи, данные список companyids (Список lstCompanyIds).

Итак, я беру все PersonCompanyId с помощью следующего запроса:

var qpc = (from c in lstCompanyIds 
      join u in personCompanyService.GetPersonCompanies() 
      on c equals u.CompanyId 
      select u.PersonCompanyId).AsQueryable(); 

С помощью этого запроса, я хочу, чтобы получить пользователей:

var query = from q in GetUsers() 
      join q2 in qpc 
      on q.PersonCompanies.Select(y => y.PersonCompanyId) equals q2 
      select q; 

Но это дает ошибку компиляции «Тип одно из выражений в предложении join неверно. Ошибка ввода типа в вызове 'Join'. " Очевидно, потому что я стараюсь сделать выбор в коллекцию personcompanies. Но как мне это сделать правильно? (Содержит не работает, потому что у меня есть две коллекции для сравнения ...)

+0

Вы проверили этот вопрос и решение? : http://stackoverflow.com/questions/19184019/the-type-of-one-of-the-expressions-in-the-join-clause-is-incorrect-in-entity-fra –

+0

Являются ли 'PersonCompanyId' и 'q2' того же типа (* System.Guid *)? – Loetn

+0

@ BurakKarakuş Да, но не могу понять, как это может решить мою проблему. – JurgenStillaert

ответ

1

Вы можете попробовать

var qpc = (from res in 
         (from c in lstCompanyIds 
         join u in personCompanyService.GetPersonCompanies() 
         on c equals u.CompanyId 
         select u.PersonCompanyId) 
        join u in GetUser() 
        on res equals u.UserId 
        select u).AsQueryable(); 

Я думаю, что это должно работать

Убедитесь, что все ID вы сравниваете имеют тип System.Guid

+0

Я внес некоторые изменения и, похоже, работает (u.PersonCompanyId => u.PersonId и res равно u.PersonId). Я должен проверить еще немного, но, похоже, работает. – JurgenStillaert

1

Проблема в том, что вы делаете сравнение IQueryable<Guid> с Guid. Если я вас правильно понял, что это то, что вы пытаетесь достичь:

IQueryable<Guid> companyIds = Enumerable.Empty<Guid>().AsQueryable(); //qpc in your question 
IQueryable<Person> persons = Enumerable.Empty<Person>().AsQueryable(); //q in your question 
var result = persons.Where(person => person.PersonCompanies 
      .Any(company => companyIds.Contains(company.CompanyId))); 
+0

Я пробовал это, но не получал никакого результата, перенастроенного (и это должно). Я пытаюсь понять это. – JurgenStillaert

+0

@JurgenStillaert: Вводные коллекции не пустые, вы не получаете исключений и ошибок, но результат пуст? – nikis