我正在为兽医编写数据输入应用程序,我遵循了MVC Nerd Diner应用程序中使用的许多原则。我90%完成了我的应用程序,但试图清理一个恼人的问题:
目前,当用户将宠物添加到发票时,我会有一个下拉列表,列出所有客户当前的宠物 - 无论他们是否已经在发票上。我希望它只包含未在发票上的顾客的宠物,这样他们就不能多次添加同一只宠物。
在Nerd Dinner教程应用程序之后,我有一个CustomerRepository.cs文件,其中包含以下查询:
// Finds list of a customer's pets
public IQueryable<Pet> FindCustomerPets(int id)
{
return from pet in db.Pets
where pet.CustomerID == id
select pet;
}
如果宠物已经访问过,则会有访问详细记录。所以...我想写的是一个查询,如果没有访问详细信息,它只会带宠物。以下是我正在使用的内容:
public IQueryable<Pet> FindPetsNotOnVisit(int id)
{
Visit visit = GetVisit(id);
var pets = FindCustomerPets(visit.CustomerId);
var visitDetails = from visitDetail in db.VisitDetails
where visitDetail.VisitID == id
select visitDetail;
//What do I need to do to remove where pet.PetID == visitDetail.PetID?
}
答案 0 :(得分:4)
pets.Where(p=>!visitDeails.Any(v=>v.PetID==p.PetID));
记事本代码。
答案 1 :(得分:3)
不确定我的域名是否合适,但请尝试以下内容:
public IQueryable<Pet> FindPetsNotOnVisit(int id)
{
Visit visit = GetVisit(id);
var pets = FindCustomerPets(visit.CustomerId);
var petIds = from visitDetail in db.VisitDetails
where visitDetail.VisitID == id
select visitDetail.PetID;
return pets.Where(p => !petIds.Contains(p.PetID));
}
你最终可能会得到不那么漂亮的SQL语句。使用SQL Server Profiler确切了解如何进行操作。
答案 2 :(得分:1)
from pet in pets
join visit in db.VisitDetails
on pet.id equals visit.petid into g
where !g.Any()
select pet