【发布时间】:2014-06-06 03:35:43
【问题描述】:
我有一个用c#、asp.net-mvc-5 和entity-framework-6 编写的项目,我有以下课程:
public class Profession
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Description { get; set; }
}
public class Person
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
}
public class Individuals : Person
{
public string CPF { get; set; }
public int Profession_Id { get; set; }
[ForeignKey("Profession_Id")]
public Profession Profession { get; set; }
}
public class Corporate : Person
{
public string CNPJ { get; set; }
}
而我的DbContext 班级是:
public class Context : DbContext
{
public Context() : base("AppConnectionString") { }
public DbSet<Profession> Professions { get; set; }
public DbSet<Person> People { get; set; }
public DbSet<Individuals> Individuals { get; set; }
public DbSet<Corporate> Corporations { get; set; }
}
在运行我的应用程序时,生成的数据库具有以下结构:
表People 和列Id、Name、CNPJ、CPF 和Discriminator。和表 Professions 与 Id 和 Description 列。
这是我的示例项目:
public class Program
{
public static void Main(string[] args) {
var context = new Context();
GenerateDatabase(context);
// display the data
System.Console.ReadKey();
}
private static void GenerateDatabase(Context context)
{
if (!context.Database.Exists())
{
context.Database.Create();
var p1 = new Profession { Description = "Profission 1" };
var p2 = new Profession { Description = "Profission 2" };
context.Professions.Add(p1);
context.Professions.Add(p2);
context.SaveChanges();
context.Individuals.Add(new Individuals { Name = "People 1", CPF = "CPF Teste 1", Profession_Id = p1.Id });
context.Individuals.Add(new Individuals { Name = "People 2", CPF = "CPF Teste 2", Profession_Id = p2.Id });
context.Corporations.Add(new Corporate { Name = "Person 1", CNPJ = "CNPJ Teste 1" });
context.Corporations.Add(new Corporate { Name = "Person 2", CNPJ = "CNPJ Teste 2" });
context.SaveChanges();
}
}
}
好吧,在 Main 方法中,我有以下代码 sn-p 来显示数据:
var items = context.People.OfType<Individuals>();
foreach (var item in items)
System.Console.WriteLine(item.Id.ToString() + " | " + item.Name + " | " item.Profession.Description + " | " + item.GetType().Name);
var items2 = context.People.OfType<Corporation>();
foreach (var item in items2)
System.Console.WriteLine(items2.Id.ToString() + " - " + items2.Name);
我需要一个串联来对结果进行排序。
在此示例中,按类的 Name 属性排序没有正确的结果。
+----+----------+--------------+--------------+
| ID | Name | Profession | Discriminator|
+----+----------+--------------+--------------+
| 1 | Person 1 | Profission 1 | Individuals |
| 2 | Person 2 | Profission 1 | Individuals |
| 3 | Person 1 | | Corporate |
| 4 | Person 2 | | Corporate |
+----+----------+--------------+--------------+
我需要收集这两种类型的记录以显示在查询页面中。所以试图Concat,被告知要做一个Union all。
很快,我测试了类似的东西:
var items = context.People.OfType<Individuals>().Include(x => x.Profession).Concat<Individuals>(
context.People.OfType<Corporate>().Select(x => new Corporate
{
Id = x.Id,
Name = x.Name,
CNPJ = x.CNPJ
}));
items = items.OrderBy(x => x.Name);
但这是错误的,无法编译!
如何使用 Queryable 来做到这一点?
【问题讨论】:
标签: c# asp.net-mvc-5 entity-framework-6 c# asp.net linq asp.net-mvc-5 entity-framework-6