2013-01-04 191 views
0

我已经完成了简单的LINQ查询,但是我很困惑现在需要创建的2。基本上我会得到一个班级ID发送。我将发布实体基于下面的类。复杂的Linq到实体查询

public class ScheduledClass 
{ 
    public ScheduledClass() 
    { 
     Attendees = new List<ClassAttendee>(); 
    } 

    [HiddenInput(DisplayValue = false)] 
    public int ID { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    [Required(ErrorMessage = "Please enter a topic")] 
    public int ClassTopicID { get; set; } 

    [Display(Name = "Topic")] 
    public virtual ClassTopic ClassTopic { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    public int ClassTypeID { get; set; } 

    [Display(Name = "Class Type")] 
    public virtual ClassType ClassType { get; set; } 

    [Required] 
    [DataType(DataType.Date)] 
    [Display(Name = "Class Date")] 
    public DateTime ClassDate { get; set; } 

    [Display(Name = "Attendees")] 
    public virtual ICollection<ClassAttendee> Attendees { get; set; } 
} 

public ClassTopic() 
    { 
     Products = new List<ClassTopicProduct>(); 
    } 

    [HiddenInput(DisplayValue = false)] 
    public int ID { get; set; } 

    [Required(ErrorMessage = "Please enter a title")] 
    public string Title { get; set; } 

    [DataType(DataType.MultilineText)] 
    public string Description { get; set; } 

    [Display(Name = "Products")] 
    public virtual ICollection<ClassTopicProduct> Products { get; set; } 
} 

public class ClassTopicProduct 
{ 
    [HiddenInput(DisplayValue = false)] 
    public int ID { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    public int ClassTopicID { get; set; } 

    [ForeignKey("ClassTopicID")] 
    public ClassTopic ClassTopic { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    public int ProductID { get; set; } 

    [ForeignKey("ProductID")] 
    public ProductType ProductType { get; set; } 
} 

public class CustomerEmail 
{ 

    public CustomerEmail() 
    { 
     CustomerEmailModules = new List<CustomerEmailModule>(); 
    } 

    [HiddenInput(DisplayValue = false)] 
    public int ID { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    public int CustomerID { get; set; } 

    public virtual Customer Customer { get; set; } 

    public string Name { get; set; } 
    public string Email { get; set; } 

    [DataType(DataType.PhoneNumber)] 
    public string PhoneNumber { get; set; } 

    [Display(Name = "Product Update")] 
    public Boolean SendProductUpdateEmail { get; set; } 
    [Display(Name = "Expiration ")] 
    public Boolean SendExpirationEmail { get; set; } 

    [Display(Name = "Products")] 
    public virtual ICollection<CustomerEmailModule> CustomerEmailModules { get; set; } 
} 

public class CustomerEmailModule 
{ 
    [HiddenInput(DisplayValue = false)] 
    public int ID { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    public int CustomerEmailID { get; set; } 

    public CustomerEmail CustomerEmail { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    public int? ProductID { get; set; } 

    [ForeignKey("ProductID")] 
    public ProductType ProductType { get; set; } 
} 

EDIT_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _

public class ProductType 
{ 
    [HiddenInput(DisplayValue = false)] 
    public int ID { get; set; } 

    [Required(ErrorMessage = "Please enter a product type description")] 
    public string Description { get; set; } 

    public virtual ICollection<ProductTypeDetail> ProductDetails { get; set; } 
} 

EDIT_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _

所以我基本上试图发送电子邮件对可能对即将到来的课程感兴趣的人。每个班级都有一门课题。类主题有一个或多个与它们相关的产品。当我获得班级ID时,我需要去获取与班级的班级主题相关的所有产品。一旦我有了,我需要去看看CustomerEmails。每个CustomerEmail都有许多他们感兴趣的产品。我需要找到任何具有CustomerEmailModules的CustomerEmail,其中的PRoductID = Class Topic Products结果中的任何产品ID。以下是我在下面试图做的不工作。

public JsonResult GetEmailClassInterest(int id) 
    { 
     var classprods = UoW.ScheduledClasses 
      .Where(o => o.ID == id) 
      .Select(p => new 
      { 
       p.ClassTopic.Products 
      }); 

     var customeremails = from p in UoW.CustomerEmails where classprods.Any(z => z.Products.Any(x => x.ID == p.ID)) select p.Email; 
     return Json(customeremails, JsonRequestBehavior.AllowGet); 
    } 

该查询似乎运行良好,但我没有得到任何结果,并有shoudl基地没有数据我有。如果有人能告诉我我做错了什么,我将不胜感激。

感谢

+0

我想通了这个问题的一部分。在最后一行,我比较了两个对象的ID。我改变了这部分z.Products.Any(x => x.ID == p.ID))为z.Products.Any(x => x.ProductID == p.ID)),但仍然存在问题因为我不想将它分隔到CustomerEmail的ID,我需要将它与CustomerEmail绑定的CustomerEmailModules的所有IDS进行比较。 –

+0

CustomerEmailModules是否具有FK到CustomerEmail?因为你没有这个注释。 – IronMan84

+0

它确实有它作为一个ForeignKey通常发生在我身边由sayign忽略CustomerEmail包含一个CustomerEmailModules虚拟ICollection并有一个字段调用

在这种情况下CustomerEmail由Id –

回答

0

尝试这样做:

var classprods = UoW.ScheduledClasses 
      .Where(o => o.ID == id) 
      .SelectMany(sched => sched.ClassTopic.Products.Select(prod => prod.ProductID)); 

var customerEmails = UoW.CustomerEmailModules.Include("CustomerEmails") 
              .Where(mod => mod.ProductID != null && classprods.Contains(mod.ProductID) 
              .Select(mod => mod.CustomerEmail.Email); 
+0

我收到以下错误错误'System.Linq.IQueryable '不包含'Contains'的定义和最佳扩展方法重载'System.Linq.ParallelEnumerable。包含(System.Linq.ParallelQuery ,TSource)'有一些无效参数 –