C# LINQ到SQL查找未列在其他列表中的对象
我正在为兽医编写一个数据输入应用程序,我遵循了MVC Nerd Diner应用程序中使用的许多原则。我已经90%完成了我的应用程序,但正试图解决一个恼人的问题: 目前,当用户将宠物添加到发票中时,我有一个下拉列表,列出所有客户当前的宠物-无论它们是否已经在发票上。我想它只包括客户的宠物还没有在发票上,所以他们不能添加相同的宠物一次以上 在Nerd晚餐教程应用程序之后,我有一个CustomerRepository.cs文件,其中包含以下查询:C# LINQ到SQL查找未列在其他列表中的对象,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我正在为兽医编写一个数据输入应用程序,我遵循了MVC Nerd Diner应用程序中使用的许多原则。我已经90%完成了我的应用程序,但正试图解决一个恼人的问题: 目前,当用户将宠物添加到发票中时,我有一个下拉列表,列出所有客户当前的宠物-无论它们是否已经在发票上。我想它只包括客户的宠物还没有在发票上,所以他们不能添加相同的宠物一次以上 在Nerd晚餐教程应用程序之后,我有一个CustomerRepository.cs文件,其中包含以下查询: // Finds list of a customer
// 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;
}
//查找客户宠物的列表
公共IQueryable FindCustomerPets(内部id)
{
在db.Pets中从宠物返回
其中pet.CustomerID==id
选择宠物;
}
如果一只宠物已经在访问中,将会有一个访问详细记录。所以我想写的是一个查询,如果没有宠物的访问细节,它只会接受宠物。以下是我的工作内容:
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?
}
public IQueryable FindPetsNotOnVisit(int-id)
{
访问=获取访问(id);
var pets=FindCustomerPets(visit.CustomerId);
var visitDetails=来自数据库中的visitDetail.visitDetails
其中visitDetail.VisitID==id
选择visitDetail;
//要删除where pet.PetID==visitDetail.PetID,我需要做什么?
}
记事本代码
记事本代码。不确定我是否正确获取了您的域名,但请尝试以下操作:
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));
}
public IQueryable FindPetsNotOnVisit(int-id)
{
访问=获取访问(id);
var pets=FindCustomerPets(visit.CustomerId);
var petIds=来自数据库中的visitDetail.VisitDetails
其中visitDetail.VisitID==id
选择visitDetail.PetID;
返回pets.Where(p=>!petIds.Contains(p.PetID));
}
最终可能会得到不那么漂亮的SQL语句。使用SQL Server Profiler准确地了解如何进行此操作。不确定我是否正确获取了您的域,但请尝试以下操作:
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));
}
from pet in pets
join visit in db.VisitDetails
on pet.id equals visit.petid into g
where !g.Any()
select pet
public IQueryable FindPetsNotOnVisit(int-id)
{
访问=获取访问(id);
var pets=FindCustomerPets(visit.CustomerId);
var petIds=来自数据库中的visitDetail.VisitDetails
其中visitDetail.VisitID==id
选择visitDetail.PetID;
返回pets.Where(p=>!petIds.Contains(p.PetID));
}
最终可能会得到不那么漂亮的SQL语句。使用SQL Server Profiler准确地找出如何进行此操作。目前为止最好的解决方案可能是最好的解决方案IMHO@Hasan汗:对不起。修改。@Hasan Khan:ops,对不起。被改进的。
from pet in pets
join visit in db.VisitDetails
on pet.id equals visit.petid into g
where !g.Any()
select pet