【问题标题】:Use related entity's IQueryable in IQueryable of entity在实体的 IQueryable 中使用相关实体的 IQueryable
【发布时间】:2019-12-14 01:29:05
【问题描述】:

我正在使用 EF Core 和 Linq。

假设我有一个名为 Dog 的类。 Dog 表与 Mammal 表具有 has-a 关系。 考虑以下用于搜索和查询数据库的文件:

public class DogSearch
{
      public string Name{get;set;}
      public int? NumberOfLegs{get;set;}
      public string Breed{get;set}

     IQueryable<Dog> BuildSearchQuery(IQueryable<Dog> qry)
    {
     if (!string.IsNullOrEmpty(Name))
            qry = qry.Where(a => a.Mammal.Name.Contains(Name));

      if (NumberOfLegs != null)
            qry = qry.Where(a => a.Mammal.NumberOfLegs == NumberOfLegs);

      if (Breed != null))
            qry = qry.Where(a => a.Breed== Breed);

      return qry;

    }
}



public class MammalSearch
{
      public string Name{get;set;}
      public int? NumberOfLegs{get;set;}

     IQueryable<Mammal> BuildSearchQuery(IQueryable<Mammal> qry)
    {
     if (!string.IsNullOrEmpty(Name))
            qry = qry.Where(a => a.Name.Contains(Name));

      if (NumberOfLegs != null)
            qry = qry.Where(a => a.NumberOfLegs == NumberOfLegs);

       return qry;

    }
}

我想以某种方式与 DogSearch 类共享 MammalSearch 类中的代码。这样可以在一个地方维护对 Name 和 NumberOfLegs 的搜索。我正在努力重构它来做到这一点。如何让IQueryable&lt;Dog&gt; 使用IQueryable&lt;Mammal&gt;

编辑:

EF使用的POCO如下:

public class Dog
{
   public Id{get;set;}
   public string Breed{get;set}
   public Guid MammalId{get;set;}
   [ForeignKey(nameof(MammalId))]
   public Mammal Mammal{get;set;}
 }

public class Mammal
{
   public Id {get;set;}
   public string Name{get;set}
   public int NumberOfLegs{get;set;}
 }

【问题讨论】:

    标签: c# entity-framework .net-core linq-to-entities iqueryable


    【解决方案1】:

    如果您想将 dog 和 mamal 之间的关系保持为“has-a”关系(如果使用继承将是“is-a”关系),我将按照以下方式进行:

    在 Mammal 类中创建一个名为 Dogs 的属性,类型为 ICollection&lt;Dog&gt;

    public class Mammal
    { 
        ...
        public ICollection<Dog> Dogs { get; set; }
    }
    

    将您的DogSearch.BuildSearchQuery() 改为接收IQueryable&lt;Mammal&gt;,如下所示:

    public IQueryable<Dog> BuildSearchQuery(IQueryable<Mammal> qry)
    {
        var mamals = new MammalSearch().BuildSearchQuery(qry); //Use injection or something else to create the MammalSearch class
    
        var dogs = mamals.SelectMany(a => a.Dogs);
    
        if (Breed != null)
            dogs = dogs.Where(a => a.Breed == Breed);
    
        return dogs;
    }
    

    这将导致哺乳动物和狗类被 EF 加入和过滤。

    【讨论】:

    • 这是有道理的。我已将我的问题更正为“has-a”而不是“is-a”
    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 2011-07-24
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    相关资源
    最近更新 更多