WHERE IN объект AS объект Entity Framework

Colour Dalnet спросил: 31 июля 2018 в 09:49 в: c#

Если у меня есть объекты Company:

var companies = db.Companies.Where(...);

И объекты User, относящиеся к Company object one-to-many:

var users = db.Users.Where(...);

Как я могу достичь такого критерия, как select * from users where user.company in (company)

Чтение из некоторых статей, я попробовал что-то вроде:

users.Where(x => companies.Contains(x.company))

Но похоже не работает. Что я пропустил здесь?

EDIT

Точный ответ:

public PartialViewResult IndexGrid(String search)
{
    var companies = db.Users.Find(User.Identity.GetUserId()).Companies.AsQueryable();
    Guid[] guids = companies.Select(c => c.Id).ToArray();    if (String.IsNullOrEmpty(search))
        return PartialView("_IndexGrid", db.Set<Quotation>().OrderByDescending(x => x.Code).AsQueryable()
            .Where(x => guids.Contains(x.Company.Id)));
    else
        return PartialView("_IndexGrid", db.Set<Quotation>().OrderByDescending(x => x.Code).AsQueryable()
            .Where(x => guids.Contains(x.Company.Id))
            .Where(x => x.Code.Contains(search)|| x.MasterCustomer.Name.Contains(search)));
}


2 ответа

Есть решение
Kiryl Khadanovich ответил: 31 июля 2018 в 10:01

Когда вы используете последний вариант как

users.Where(x => companies.Contains(x.company))

.Net не знает, как сравнивать компании, и использует ссылки на равные объекты. Попробуйте, если ваша компания имеет свойство id , Если нет, пожалуйста, дайте мне знать.

users.Where(x => companies.Select(c => c.Id).Contains(x.company.Id))
Colour Dalnet ответил: 31 июля 2018 в 10:24
Отличное объяснение. Благодарю вас. Это работает.
Matthias Burger ответил: 31 июля 2018 в 10:00

Полагаю, вам нужно выбрать для его идентификаторов:

var companies = db.Companies.Where(...);
var myUsers = db.Users.Where(w=>companies.Select(x=>x.Id).Contains(w.CompanyId)).ToList();

, если между ними есть ссылка, то вы можете, например:

var myUsers = db.Users.Include(x=>x.Company)
                   .Where(w=>w.Company != null && w.Company.Name == "MyCompanyName")
                   .ToList();