查询EF Code First中的两个继承类

时间:2013-10-29 19:18:25

标签: c# linq inheritance ef-code-first table-per-type

我首先使用EF代码,并且我有两个继承自基类(TPT)的类:

public class Party
{
   public int PartyId {get; set;}
}
public Person:Party
{
   string FirstName { get; set; }  
   string LastName { get; set; }  
} 
public Organization:Party
{
   string Name { get; set; }  
} 

现在,我想创建一个查询来获取Person s等于“SomeName”的所有LastName以及Organization开始的所有Name在一次交易中使用“A”。 像这样的东西

IList<Party> GetParties(string name, string organizationName)
{
   IList<Party> result = new List<Party>();   
   using(var context = new MyContext())
   { 
      var persons = context.Parties.OfType<Person>().Where(t=>t.LastName = name) ;
      var organizations = context.Parties.OfType<Organization>().Where(t=>t.Name.StartWith(organizationName));
      //return merge of persons and organizations 
   }
}

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

你可以做到

context.Parties.OfType<Person>().Where(t=>t.LastName = name).OfType<Party>()
.Concat(context.Parties.OfType<Organization>()
               .Where(t=>t.Name.StartWith(organizationName)))

您不必将第二个集合投放到Party,因为它与一个与IQueryable<Party>协变的IQueryable<Organization>连接在一起。

答案 1 :(得分:-1)

我做了一些LINQPad摆弄,我相信这是你想要的结果。

IList<Party> GetParties(string name, string organizationName)
{       
   IList<Party> result = new List<Party>();
   using(var context = new MyContext())
   { 
      var persons = context.Parties.OfType<Person>().Where(t=>t.LastName = name) ;
      var organizations = context.Parties.OfType<Organization>().Where(t=>t.Name.StartWith(organizationName));
      //return merge of persons and organizations 

      result = (IList<Party>)persons.Union((IEnumerable<Party>)organizations);          
   }
   return result;
}