C# 使用实体框架获取视图模型的最佳方法

C# 使用实体框架获取视图模型的最佳方法,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,假设我有这样一个域模型: public class Book { public int ID { get; set; } public string Title { get; set; } public string Author { get; set; } public DateTime PublicationDate { get; set; } public DateTime EntryDate { get; set; } public str

假设我有这样一个域模型:

public class Book
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public DateTime PublicationDate { get; set; }
    public DateTime EntryDate { get; set; }
    public string EnteredBy { get; set; }
}
public class BookView
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public DateTime PublicationDate { get; set; }
}
但我希望视图模型排除某些字段,如下所示:

public class Book
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public DateTime PublicationDate { get; set; }
    public DateTime EntryDate { get; set; }
    public string EnteredBy { get; set; }
}
public class BookView
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public DateTime PublicationDate { get; set; }
}
有两种方法可以从数据库中获取视图模型。第一种方式是:

List<BookView> views = context.Books.Where(b=>b.Author=="Winston Churchill")
    .Select(b=>new BookView() { ID=b.ID,Title=b.Title,Author=b.Author,PublicationDate=b.PublicationDate})
    .ToList();
var results = context.Books.Where(b => b.Author == "Winston Churchill");
List<BookView> views = new List<BookView>();
foreach(var b in results)
{
    views.Add(new BookView() { ID = b.ID,Title = b.Title,Author = b.Author,PublicationDate = b.PublicationDate});        
}
List view=context.Books.Where(b=>b.Author==“温斯顿·丘吉尔”)
.Select(b=>newbookview(){ID=b.ID,Title=b.Title,Author=b.Author,PublicationDate=b.PublicationDate})
.ToList();
第二种方式是:

List<BookView> views = context.Books.Where(b=>b.Author=="Winston Churchill")
    .Select(b=>new BookView() { ID=b.ID,Title=b.Title,Author=b.Author,PublicationDate=b.PublicationDate})
    .ToList();
var results = context.Books.Where(b => b.Author == "Winston Churchill");
List<BookView> views = new List<BookView>();
foreach(var b in results)
{
    views.Add(new BookView() { ID = b.ID,Title = b.Title,Author = b.Author,PublicationDate = b.PublicationDate});        
}
var results=context.Books.Where(b=>b.Author==“温斯顿·丘吉尔”);
列表视图=新列表();
foreach(结果中的var b)
{
添加(newbookview(){ID=b.ID,Title=b.Title,Author=b.Author,PublicationDate=b.PublicationDate});
}

我的问题是,这种差异对性能有影响吗?后者将允许更多的层分离——例如,
Book
模型可以位于一个单独的
Data
程序集中,而该程序集根本不引用视图模型。但是,我想知道
Select
子句是否使查询更高效。

Select子句确实使查询更高效。select直接在数据库上执行,因为它是一个IQuerable对象,所以您将只查询select中的字段。另一种方法是查询所有列并在内存中操作它们。

如果条件不匹配,第一种方法将抛出异常。至于第二个,您可以随时检查列表是否为空。至于性能,这并不重要。我建议使用
for
循环,而不是
foreach
,这对于大型集合来说要快一点。@Cristian Szpisjak它会引发什么异常?我在尝试此代码时没有遇到异常。@Matthew您是否尝试过评测或任何类型的性能测试?查看过每种情况下生成的SQL吗?@Cristian Szpisjak它不会引发异常,它将返回一个空列表。@Fran你说得对,不确定performatic这个词。即使我同意答案,performatic的意思是表现得更好,但这个词并不存在。我想你在找表演。这甚至是冒险,告诉谷歌吧。