Imagine that you have these entities
public class Product { public int ID { get; set; } public string Name { get; set; } public virtual Category Category { get; set; } }
But for your UI you want to display the product id, product name and the product’s category’s name.
You might try passing this query to the presentation layer.
var displayData = from product in ctx.Products.Include("Category") select product;
But then you are passing more than is required around, and binding the UI tightly to the conceptual model, which is probably a bad idea.
Your next try might be a query like this:
var displayData = from product in ctx.Products select new { ID = product.ID, Name = product.Name, CategoryName = product.Category.Name };
But then you’ll quickly discover you can’t pass the anonymous types to another method, at least not without a nasty hack.
Most people think LINQ to Entities can only materialize Entities and Anonymous types.
But in fact it turns out it can materialize any non-generic class that has a default constructor. Anyway what this means is you can create a view class like this:
public class ProductView { public int ID { get; set; } public string Name { get; set; } public string CategoryName { get; set; } }
And then write this:
And then pass this to your view without any problems at all.
I only just found out about this myself, I had always assumed this would fail.
So this was a nice pleasant surprise.