2011-02-24 43 views
3

我有一个多对多的表结构称为PropertyPets。它包含一个由PropertyID(来自Property表)和一个或多个PetID(来自Pet表)的双主键组成。LINQ多对多有或包含子句(和一个扭曲)

接下来我有一个搜索屏幕,人们可以从jquery multiple select下拉选择多个宠物。比方说,有人选择狗和猫。

现在,我希望能够返回在多对多表格PropertyPets中包含两个狗和猫的所有属性。我试图用Linq to Sql来做到这一点。

我已经看过了包含子句,但它似乎并没有对我的要求工作:

var result = properties.Where(p => search.PetType.Contains(p.PropertyPets)); 

这里,search.PetType是的ID,用于狗和猫的int []数组(在多选下拉菜单中选择)。问题首先,Contains需要一个字符串,而不是类型为PropertyPet的IEnumerable。其次,我需要找到既有狗又有猫的特性,而不仅仅是包含一个或另一个。

谢谢你的任何指针。

回答

5

您可以使用嵌套的where子句执行此操作。

您需要使用contains筛选p.PropertyPets - 返回PetID所在的所有行search.PetType

那么只有从properties返回行的所有搜索的ID已被发现 - 例如number of rows >= number of serach id's

一起:

var result = from p in properties 
      where p.PropertyPets.Where(c => search.PetType.Contains(c.PetID)).Count() >= search.PetType.Count() 
      select p; 
+0

杰夫 - 它的作品!谢谢。非常简洁,看起来非常有创意,可以启动。 – Chris 2011-02-24 16:57:16

+0

@Chris - 没问题。乐于帮助 :) – 2011-02-24 18:01:43

0

对于那些Contains需要string不会是真​​实的一部分,Contains应该需要一个int如果你search.PetTypeint[]。这意味着您需要将p.PropertyPets“转换”为int。要将p.PropertyPets转换为IEnumerable<int>,您需要选择PropertyID字段:p.PropertyPets.Select(propertyPet => propertyPet.PropertyID),但这并不会根据需要为您提供单个int,而是包含一大堆。 (.First()会给你一个INT却解决不了你的问题。

你真正想要做的是

var result = properties.Where(p => 
    search.PetType.Except(p.PropertyPets.Select(propertyPet => 
          propertyPet.PropertyID)).Count() == 0); 

Except不LINQ2SQL用。

我能找到的最好的办法是在search.PetType申请Contains每个项目

事情是这样的:

var result = properties; 
foreach(var petType in search.PetType) 
{ 
    result = from p in result 
      where p.PropertyPets.Select(propertyPet => 
        propertyPet.PropertyID).Contains(petType) 
      select p; 
} 
+0

Albin-这并没有为我工作。从概念上来说,它似乎是应该的。在编译器抱怨的时候,我在最后添加了一个'Select p',但仍然没有结束。即使我选择了属性确实有的宠物,结果也没有属性。 – Chris 2011-02-24 16:51:29