C# LINQ到SQL查找未列在其他列表中的对象

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

我正在为兽医编写一个数据输入应用程序,我遵循了MVC Nerd Diner应用程序中使用的许多原则。我已经90%完成了我的应用程序,但正试图解决一个恼人的问题:

目前,当用户将宠物添加到发票中时,我有一个下拉列表,列出所有客户当前的宠物-无论它们是否已经在发票上。我想它只包括客户的宠物还没有在发票上,所以他们不能添加相同的宠物一次以上

在Nerd晚餐教程应用程序之后,我有一个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;
    }
//查找客户宠物的列表
公共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