LINQ to SQL查找未在另一个列表中列出的对象

时间:2010-08-05 02:30:16

标签: c# asp.net-mvc linq

我正在为兽医编写数据输入应用程序,我遵循了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?    
}

3 个答案:

答案 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