0

我正在使用 Database First EF5 迈出第一步,我试图在 EF5 ORM 范式中从经典的 ,等中重现我的知识,但我被困住了:DataTableDataAdapter

我过去经常使用DataGridsViewsTrees填充它们Stored Procedures。我用来显示的信息对应于多个表/实体。

例如,假设一个博客应用程序。像这样的帖子,用户等:

表:

  • Post {Id, Subject, Body, Date, Author}
  • User {Id, Name, Email, Pwd}

为了加入所有表格并计算一些值,我们有一个StoredProcedure. 此 SP 从表和 2 个运行时计算值返回Post属性User

  • Post.Subject, Post.Body, Post.Categories, User.Name, DaysSincePublished, IsAuthorOnline

或者让它更容易:

  • Post.*, User.*, DaysSincePublished, IsAuthorOnline

问题:

  • 是否可以一次将先前的记录集适合多个实体(PostUser)?并用它填充 DataGridView?
  • 是否可以将其放入动态创建的实体中?在这种情况下,是否可以从 DataGridView 中更新(绑定)它。
  • 我对问题的处理方法错误吗?

我尝试过类似Context.ObjectContext.Translate<TEntity>()orContext.Database.SqlQuery<TEntity>(storedProcedure, parameterArray);但一次只返回 1 个实体的方法。

注意: 使用此示例可以忘记StoredProcedure并进行linq查询。但在实际场景中,我有超过 10 个表和子查询的查询,几次没有 FK,......并且非常关心服务器性能,存储过程是必须的。

4

1 回答 1

1

好吧,无论如何,你的问题很模糊......

要正确使用 ORM,比如 EF,我认为理解 SQL 世界比理解对象世界更好。

因此,假设您有两个与您的表相对应的类:

我想您将首先使用数据库,而不是 Code First 或 Model First。

使用 EF 时,将从您的数据库生成类。

类似的东西:

public partial class Post {
   public int Id {get;set;}
   public string Subject  {get;set;}
   public string Body {get;set;}
   public DateTime Date {get;set;}
   //etc.
   public virtual User Author {get;set;} //this is what's called a Navigation proeprty, which will help you to find relations with your User class.
}

public partial class User {
   public int Id {get;set;}
   public string Name {get;set;

   public IList<Post> Posts {get;set;}//Navigation property from User to Post class. It's a list, reflecting the one-to-many from Post to User.
}

现在,对于计算属性,您可以通过几种方式执行此操作。

一种是创建部分类 Post 的另一部分

public partial class Post {
  public int DaysSincePublished {get {return (DateTime.Now - Date).Days;}}
}

然后,您可以使用这样的简单查询,说您有

public DbSet<User> Users {get;set;}
public DbSet<Post> Posts {get;set;}

然后

var myQuery = context.Users.Include(m => m.Posts);

var list = myQuery.ToList();//this will get data from your db.

在列表中,您拥有所需的所有字段,包括“计算的属性”(好吧,您已经从 Post 和 User 中获得了所有信息,实际上这可能比您真正需要的要多)。

为避免检索所有数据,您可以使用匿名类型(或自定义类)中的选择数据

var myQuery = context.Posts.Select(m => new  {
   subject = m.Subject,
   body = m.Body,
   userName = m.User.Name,
   daysSincePublished = SqlFunctions.DiffDays(m.Date, DateTime.Now)//see another way to get calculated value
 });

var list = myQuery.ToList()//retrieving only the required fields from db.

而“我的真正需求对于 ORM 来说太复杂了”的论点没有多大意义。无论如何,您仍然可以在需要时使用 SP,甚至可以使用原始 sql。目标过于务实,但在得出明确结论之前进行一些调查;)

于 2013-02-01T18:29:33.320 回答