2016-12-01 65 views
2

鑑於以下類別,我希望能夠使用ID列表來返回DesignAttribute表中具有AttributeId爲1或3的設計。如何使用列表查詢查找表?

public class Design 
{ 
    public int DesignId { get; set; } 
    public string DesignName { get; set; } 
    public virtual List<DesignAttribute> DesignAttributes { get; set;} 
} 

public class Attribute 
{ 
    public int AttributeId { get; set; } 
    public string AttributeName { get; set; } 
} 

public class DesignAttribute 
{ 
    public int DesignAttributeId { get; set; } 
    public virtual Design Design { get; set; } 
    public virtual Attribute Attribute { get; set; } 
} 

中的設計可有1個或多個屬性,例如

設計表

DesignId DesignName 
1   Design A 
2   Design B 
3   Design C 

屬性表

AttributeId  AttributeName 
1    Light 
2    Dark 
3    Demo 

DesignAttribute表

DesignAttributeId Design_DesignId  Attribute_AttributeId 
1     1     1    Design A is Light 
2     1     3    Design A is also a Demo 
3     2     2    Design B is Dark 
4     3     1    Design C is Light 

我有下面的代碼

//attributes list = "[1,3] I want any designs that have Light OR Demo attributes" 
public List<Design> FilterDesigns(List<string> attributes) 
{ 
    //sudo code as i'm not sure how to structure this. 
    var designs = db.Designs.Where(i => i.DesignAttributes 
    WHERE  DesignAttributes.AttributeId is in the list of attributes passed into the method) 
} 

所以我希望用含設計設計A和設計的C 2項列表結束,因爲他們都有一個ID對屬性ID 1和3在DesignAttribute查找表中。

回答

2

試試這個:

var designs = db.Designs.Where(design => 
        design.DesignAttributes.Any(designAttribute => 
        attributes.Contains(designAttribute.Attribute.AttributeId))) 
       .ToList(); 
1

試試這個

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication29 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<Design> designTable = new List<Design>() { 
       new Design() { DesignId = 1, DesignName = "A"}, 
       new Design() { DesignId = 2, DesignName = "B"}, 
       new Design() { DesignId = 3, DesignName = "C"} 
      }; 

      List<Attribute> attributeTable = new List<Attribute>() { 
       new Attribute() { AttributeId = 1, AttributeName = "Light"}, 
       new Attribute() { AttributeId = 2, AttributeName = "Dark"}, 
       new Attribute() { AttributeId = 3, AttributeName = "Demo"} 
      }; 
      List<DesignAttribute> designAttributeTable = new List<DesignAttribute>() { 
       new DesignAttribute() { DesignAttributeId = 1, DesignId = 1, AttributeId = 1}, 
       new DesignAttribute() { DesignAttributeId = 2, DesignId = 1, AttributeId = 3}, 
       new DesignAttribute() { DesignAttributeId = 3, DesignId = 2, AttributeId = 2}, 
       new DesignAttribute() { DesignAttributeId = 4, DesignId = 3, AttributeId = 1} 
      }; 

      var results = (from dattbl in designAttributeTable 
          join dttbl in designTable on dattbl.DesignId equals dttbl.DesignId 
          join attbl in attributeTable on dattbl.AttributeId equals attbl.AttributeId 
          select new { designName = dttbl.DesignName, attributeName = attbl.AttributeName }).ToList(); 


     } 

    } 
    public class Design 
    { 
     public int DesignId { get; set; } 
     public string DesignName { get; set; } 
     public virtual List<DesignAttribute> DesignAttributes { get; set; } 
    } 

    public class Attribute 
    { 
     public int AttributeId { get; set; } 
     public string AttributeName { get; set; } 
    } 

    public class DesignAttribute 
    { 
     public int DesignAttributeId { get; set; } 
     public int DesignId { get; set; } 
     public int AttributeId { get; set; } 
    } 

} 
1

您可以嘗試使用此查詢:

var ids = new List<int> { 1, 3 }; 
    var designs = db.DesignAttributes 
       .Where(m => ids.Contains(m.DesignAttributeId)) 
       .Select(p => p.Design) 
       .ToList(); 

它將查詢DesignAttributes其中DesignAttributeId出現在列表ids。它會選擇Designs