其中在子句中作为对象实体框架



如果我有一个Company对象:

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

Company对象相关的User对象one-to-many

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

我如何达到像select * from users where user.company in (company)这样的标准

从一些文章中阅读,我尝试了类似的东西:

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

但似乎行不通。我在这里错过了什么?

编辑

确切答案:

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)));
}

当您使用最后一个变体时

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

.Net不知道如何比较公司,并使用对相同对象的引用。 如果您的公司有 id 属性,请尝试此操作。如果没有,请告诉我。

users.Where(x => companies.Select(c => c.Id).Contains(x.company.Id))

我想你需要选择它的 ID:

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();

最新更新