| By Kevin Hoffman | Article Rating: |
|
| March 29, 2008 05:30 AM EDT | Reads: |
11,786 |
So you're building your data-driven application and you've got an ADO.NET Entity Model that represents an abstraction around your database. Maybe you're even pretty savvy and you've used inheritance and some filters to enhance the entity model so that it really is an entity model and not just a raw translation of your database schema into objects. One thing that I have noticed is that in a lot of sample code, a lot of utility functions end up being put in inefficient locations because people forget that the entity model is a partial class. This means that you can extend the model with your own properties and methods.
For example, what if you want to implement a keyword search throughout your entity model and you know that you will probably have multiple entry points in your application utilize that search function. You could probably create a class called EntityTools or some such and create a method called Search(string keyWord) , but there's a better place to put that - right in the model!
Take a look at this method:
public List<Customer> Search(string keyWord)
{
// also do whatever other normalization you
want like removing filler words, etc
keyWord = keyWord.ToLower();
var query = from Customer cust in this.Customers
where cust.FirstName.Contains(keyWord) ||
cust.LastName.Contains(keyWord) ||
cust.OrderItems.Any ( oi =>
oi.LineItem.Description.Contains(keyWord)
select cust;
return query.ToList();
}
So.. now you can write code that consumes your model like this:
using (CustomerEntities ci = new CustomerEntities())
{
List<Customer> searchResults = ci.Search("bob");
}
Not only is this easier to follow and easier to read, but its easy to maintain and you can re-use those same methods for any entity model that happens to have the same or similar schema. You can also define custom properties that expose data in a specific way that you know you will be querying frequently:
public IQueryable<Customer> PastDueCustomers
{
get {
return from Customer cust in this.Customers
where cust.OrderItems.Sum ( oi => oi.Amount ) > 0
select cust;
}
}
This code automatically creates a queryable property of customers that have unpaid balances remaining in their line item lists. Can you imagine having to do subqueries of Past Due Customers, for example, sorting the list of past due customers by their past due amount and then sub-filtering that list by those customers who are not on the 'Premier' advantage plan yadda yadda. You can use PastDueCustomers as a query source, like this:
var reallyComplicatedQuery =
from Customer cust in ci.PastDueCustomers ....
So, the next time you go to add additional business logic to your model or you need some utility methods, consider putting them in a partial class that is the same name as your model in the same namespace as your model and you may just find that your ADO.NET EF experience got a little more pleasant.
tags: adonet entity framework adoef partialclasses
links: digg this del.icio.us technorati reddit
Published March 29, 2008 Reads 11,786
Copyright © 2008 SYS-CON Media, Inc. — All Rights Reserved.
Syndicated stories and blog feeds, all rights reserved by the author.
More Stories By Kevin Hoffman
Kevin Hoffman, editor-in-chief of SYS-CON's iPhone Developer's Journal, has been programming since he was 10 and has written everything from DOS shareware to n-tier, enterprise web applications in VB, C++, Delphi, and C. Hoffman is coauthor of Professional .NET Framework (Wrox Press) and co-author with Robert Foster of Microsoft SharePoint 2007 Development Unleashed. He authors The .NET Addict's Blog at .NET Developer's Journal.
![]() |
.NET News Desk 03/26/08 10:01:13 AM EDT | |||
So you're building your data-driven application and you've got an ADO.NET Entity Model that represents an abstraction around your database. |
||||
- iPad3 vs Windows 8 - and the Winner Is...Cloud
- Eleven Reasons Why Windows Phone Will Overtake Android
- Windows Azure Overview Part 4: Security
- Agile Development & Enterprise Architecture Practice – Can They Coexist?
- Eleven Tips for Successful Cloud Computing Adoption
- GM to Pull Facebook Advertising: WSJ
- System Center Virtual Machine Manager 2012 as Private Cloud Enabler
- Apply Agile When Deploying Apps
- The Web – Changing the Way We Work
- Closer Look at One NoSQL Database – MongoDB
- Why Is Scrum So Widely Adopted and So Very Dangerously Deceptive
- Cloud Foundry vs Google App Engine
- iPad3 vs Windows 8 - and the Winner Is...Cloud
- Cisco Unveils Visual Collaboration Solutions in the Post-PC Era, Extending the Reach of TelePresence With New Mobile-to-Immersive Offerings
- Eleven Reasons Why Windows Phone Will Overtake Android
- Windows Azure Overview Part 4: Security
- Agile Development & Enterprise Architecture Practice – Can They Coexist?
- Eleven Tips for Successful Cloud Computing Adoption
- GM to Pull Facebook Advertising: WSJ
- System Center Virtual Machine Manager 2012 as Private Cloud Enabler
- Apply Agile When Deploying Apps
- The Web – Changing the Way We Work
- Book Review: Decision Management Systems
- User Group Malaise?
- Google Maps and ASP.NET
- Converting VB6 to VB.NET, Part I
- How to Write High-Performance C# Code
- Crystal Reports XI & How It Has Changed
- Creating Controls for.NET Compact Framework in Visual Studio 2005
- Where Are RIA Technologies Headed in 2008?
- Programmatically Posting Data to ASP .NET Web Applications
- Implementing Tab Navigation with ASP.NET 2.0
- AJAX World RIA Conference & Expo Kicks Off in New York City
- i-Technology Viewpoint: "SOA Sucks"
- .NET Archives: Getting Reacquainted with the Father of C#
- i-Technology Photo Exclusive: Bill Gates & Steve Jobs In "Nerds"






















