2010-06-23 109 views
1

我有一个集合(人),有一个多对多的引用到另一个集合(狗)。暂停你不相信每只狗能有多于一个人的情况。人只是包含的成员是List<Dog>帮助linq查询。很多很多

我想选择所有的人都有一定的财产(在IList中指定),宠物有一定的财产(在IList中指定)。

E.g.我有一个IList(仅用于此查询)与狗的属性值。

public enum EnumLikesToBite 
{ 
No, 
Yes, 
Sometimes 
} 

IList <<EnumLikesToBite>> listDogsMayBite = 
{ { EnumLikesToBite.Yes}, 
{ EnumLikesToBite.Sometimes}}; 

然后另一个列表人民财产:

public enum EnumKeepsPetWith 
{ 
Chain, 
String, 
Rubberband 
} 
IList <EnumKeepsPetWith> listPeopleWhoDontRestrainDog = 
{ { EnumKeepsPetWith.String }, 
{ EnumKeepsPetWith.Rubberband}}; 

我如何可以查询出所有谁都有可能咬不抑制狗狗的人。 像这样的伪代码:

Var result = from p in People where p.KeepsPet in listPeopleWhoDontRestrainDog and dog.LikesToBite in listDogsMayBite. 

结果有所有的人。当然,如果我能够得到所有可能咬人的狗,那将会很棒。

回答

1
List<int> mayBite = new List<int>() 
{ 
    (int) EnumLikesToBite.Yes, 
    (int) EnumLikesToBite.Maybe 
} 

List<int> poorRestraint = new List<int>() 
{ 
    (int) EnumKeepsPetWith.String, 
    (int) EnumKeepsPetWith.RubberBand 
} 

IQueryable<Person> query = 
    from p in db.People 
    where poorRestraint.Contains(p.KeepsPetWith) 
    where p.DogPeople.Any(dp => mayBite.Contains(dp.Dog.DoesBite)) 
    select p; 

var query = 
    from p in db.People 
    where poorRestraint.Contains(p.KeepsPetWith) 
    let bitingDogs = 
    from dp in p.DogPeople 
    let d = dp.Dog 
    where mayBite.Contains(d.DoesBite) 
    where bitingDogs.Any() 
    select new {Person = p, BitingDogs = bitingDogs.ToList()}; 
+0

真棒,你怎么破解它?你喜欢超人还是什么? – tim 2010-06-24 04:29:23

0

也许这个代码将帮助..其中一个可能的解决方案是:

var result = 
     peoples.Where(y => dontRestrainDog.Contains(y.KeepsPetWith) && y.Dogs.Any(x => dogsMayBite.Contains(x.LikesToBite))).ToList(); 
    result.ForEach(y => y.Dogs = y.Dogs.Where(x => dogsMayBite.Contains(x.LikesToBite)).ToList()); 

,你可以看到这里的一个例子:

class Program 
    { 
     static void Main(string[] args) 
     { 
      IList<EnumLikesToBite> dogsMayBite = new List<EnumLikesToBite> 
                { 
                 { EnumLikesToBite.Yes }, { EnumLikesToBite.Sometimes } 
                }; 
      IList<EnumKeepsPetWith> dontRestrainDog = new List<EnumKeepsPetWith> 
                  { 
                   { EnumKeepsPetWith.String }, { EnumKeepsPetWith.Rubberband } 
                  }; 

      var peoples = new List<People>(); 
      var dogs = new List<Dog>(); 
      Random gen = new Random(2); 

      for(int i = 0; i < 10; i++) 
      { 
       People p = new People 
           { 
            PeopleId = i, 
            KeepsPetWith = (EnumKeepsPetWith) (gen.Next(10)%3), 
            Dogs = new List<Dog>() 
       }; 
       Dog d = new Dog 
          { 
           DogId = i, 
           LikesToBite = (EnumLikesToBite) (gen.Next(10)%3), 
           Peoples = new List<People>() 
          }; 
       peoples.Add(p); 
       dogs.Add(d); 
      } 
      for(int i = 0; i < 10; i++) 
      { 
       for(int j = 0; j < 10; j++) 
       { 
        if (gen.Next(10)>7) 
        { 
         peoples[i].Dogs.Add(dogs[j]); 
        } 
        if (gen.Next(10)>7) 
        { 
         dogs[i].Peoples.Add(peoples[j]); 
        } 
       } 
      } 
      PrintDogs(dogs); 
      PrintPeoples(peoples); 

      var result = 
       peoples.Where(y => dontRestrainDog.Contains(y.KeepsPetWith) && y.Dogs.Any(x => dogsMayBite.Contains(x.LikesToBite))).ToList(); 
      result.ForEach(y => y.Dogs = y.Dogs.Where(x => dogsMayBite.Contains(x.LikesToBite)).ToList()); 

      Console.WriteLine("==================="); 
      PrintPeoples(result); 
      Console.ReadLine(); 
     } 

     private static void PrintPeoples(List<People> peoples) 
     { 
      Console.WriteLine("=Peoples="); 
      foreach (var people in peoples) 
      { 
       Console.WriteLine("Id: {0}", people.PeopleId); 
       Console.WriteLine("KeepsPetWith: {0}", people.KeepsPetWith); 
       Console.WriteLine("Dogs: "); 
       foreach (var dog in people.Dogs) 
       { 
        Console.Write("{0}, ", dog.DogId); 
       } 
       Console.WriteLine(); 
      } 
     } 

     private static void PrintDogs(List<Dog> dogs) 
     { 
      Console.WriteLine("=Dogs="); 
      foreach (var dog in dogs) 
      { 
       Console.WriteLine("Id: {0}", dog.DogId); 
       Console.WriteLine("LikesToBite: {0}", dog.LikesToBite); 
       Console.WriteLine("Peoples: "); 
       foreach (var people in dog.Peoples) 
       { 
        Console.Write("{0}, ", people.PeopleId); 
       } 
       Console.WriteLine(); 
      } 
     } 
    } 

    public class People 
    { 
     public int PeopleId { get; set; } 
     public EnumKeepsPetWith KeepsPetWith { get; set; } 
     public IList<Dog> Dogs { get; set; } 
    } 

    public class Dog 
    { 
     public int DogId { get; set; } 
     public EnumLikesToBite LikesToBite { get; set; } 
     public IList<People> Peoples { get; set; } 
    } 

    public enum EnumLikesToBite 
    { 
     No, 
     Yes, 
     Sometimes 
    } 

    public enum EnumKeepsPetWith 
    { 
     Chain, 
     String, 
     Rubberband 
    }