English 中文(简体)
Entity Framework using Generic Predicates
原标题:

I use DTO s to map between my Business and Entity Framework layer via the Repository Pattern.

A Standard call would look like

public IClassDTO Fetch(Guid id)
{
    var query = from s in _db.Base.OfType<Class>()
        where s.ID == id
        select s;

    return query.First();
}

Now I wish to pass in filtering criteria from the business layer so I tried

public IEnumerable<IClassDTO> FetchAll(ISpecification<IClassDTO> whereclause)
{            
    var query = _db.Base.OfType<Class>()
        .AsExpandable()
        .Where(whereclause.EvalPredicate);      

    return query.ToList().Cast<IClassDTO>(); 
}

The Call from the business layer would be something like

Specification<IClassDTO> school =
    new Specification<IClassDTO>(s => s.School.ID == _schoolGuid);

IEnumerable<IClassDTO> testclasses = _db.FetchAll(school);

The problem I am having is that the .Where clause on the EF query cannot be inferred from the usage. If I use concrete types in the Expression then it works find but I do not want to expose my business layer to EF directly.

问题回答

Try making FetchAll into a generic on a class instead, like this:-

public IEnumerable<T> FetchAll<T> (Expression<Func<T,bool>> wherePredicate)
  where T:IClassDTO  //not actually needed
{            
    var query = _db.Base.OfType<T>()
        .AsExpandable()
        .Where(wherePredicate);      

    return query; 
}

pass in school.Evalpredicate instead. FetchAll doesn t appear to need to know about the whole specification, it just needs the predicate, right? If you need to cast it to IClassDTO, do that after you have the results in a List.





相关问题
Entity Framework with MySQL connector in c#

I have been trying to get the Entity Framework to work in my web application using MySQL. It works fine on my local pc, but doesn t work when I put it on the server. Since the server is a shared ...

How Do I Create And Update A Many To Many Relationship With EF

I am using the Entity Framework with SQL Server. I have a many to many relationship between 2 tables. I have created a join table with just the primary key fields of the 2 tables. In the designer, the ...

Entity Framework with File-Based Database

I am in the process of developing a desktop application that needs a database. The application is currently targeted to SQL Express 2005 and works wonderfully. However, I m not crazy about having ...

Linq to enties, insert foreign keys

I am using the ADO entity framework for the first time and am not sure of the best way of inserting db recored that contain foreign keys. this is the code that i am using, I would appreciate any ...

Entity Framework - Many to many question

I have a table called ASB and a table called PeopleInvolved. There is a junction table called PeopleInvolved_ASB which simply contains an ASBID and a PeopleInvolvedID column. The columns act as a ...

Post back complex object from client side

I m using ASP.NET MVC and Entity Framework. I m going to pass a complex entity to the client side and allow the user to modify it, and post it back to the controller. But I don t know how to do that ...

ADO.NET Entity Data Model are not precise enough

I run this code: var cos = from k in _db.klienci_do_trasy where k.klient_id == 5 select k; but the query send to database is: SELECT * FROM `klienci_do_trasy` LIMIT 0, 30 why is it for, there ...

热门标签