2014-03-02 37 views
4

我有一个使用EF与数据库接口的项目。它通过WCF Web服务完成此操作。这是我的第一个EF项目,我正在努力研究如何构建基于可选参数的查询。基于可选搜索参数使用实体框架选择数据

我的web服务有一个数据协定,其中包含与EF中的类匹配的字段。 Web服务提供数据库服务,填充这些客户端类并将其传递回客户端。举一个例子....

在web服务

[DataContract] 
public class MyMovie 
{ 
    [DataMember] 
    public int MovieId; 
    [DataMember] 
    public string MovieName; 
    [DataMember] 
    public int MovieRatingId; 
    [DataMember] 
    public string MovieRunTime; 
    [DataMember] 
    public string MovieIMDBUrl; 
    [DataMember] 
    public DateTime MovieDateAdded; 
    [DataMember] 
    public List<MyMovieActor> Actors; 
    [DataMember] 
    public List<MyMovieMedia> MediaFiles; 
} 
public class MyMovieActor 
{ 
    [DataMember] 
    public int ActorId; 
    [DataMember] 
    public int ActorMovieId; 
    [DataMember] 
    public string ActorName; 
    [DataMember] 
    public string ActorCharacter; 
} 
public class MyMovieMedia 
{ 
    [DataMember] 
    public int MediaId; 
    [DataMember] 
    public int MediaMovieId; 
    [DataMember] 
    public string MediaFileLocation; 
    [DataMember] 
    public bool MediaDefault; 
} 

数据模型(简化的)...

enter image description here

我的web服务方法....

public MyMovie GetMovie(int movieId) 
    { 
     MyMovie response = new MyMovie(); 

     using (MovieDatabaseEntities DbContext = new MovieDatabaseEntities()) 
     { 
      var query = (from oData in DbContext.Movies 
         where oData.MovieId == movieId 
         select oData).ToList(); 


      if (query.Count > 0) 
      { 
       response.MovieDateAdded = query[0].MovieDateAdded; 
       response.MovieId = query[0].MovieId; 
       response.MovieIMDBUrl = query[0].MovieIMDBUrl; 
       response.MovieName = query[0].MovieName; 
       response.MovieRatingId = query[0].MovieRatingId; 
       response.MovieRunTime = query[0].MovieRunTime; 
      } 

      List<MyMovieActor> actors = new List<MyMovieActor>(); 
      foreach (MovieActor ma in query[0].MovieActors) 
      { 
       MyMovieActor a = new MyMovieActor(); 
       a.ActorId = ma.ActorId; 
       a.ActorMovieId = ma.ActorMovieId; 
       a.ActorCharacter = ma.ActorCharacter; 
       a.ActorName = ma.ActorName; 
       actors.Add(a); 
      } 
      response.Actors = actors; 

      List<MyMovieMedia> medias = new List<MyMovieMedia>(); 
      foreach (MovieMedia mm in query[0].MovieMedias) 
      { 
       MyMovieMedia med = new MyMovieMedia(); 
       med.MediaId = mm.MediaId; 
       med.MediaMovieId = mm.MediaMovieId; 
       med.MediaFileLocation = mm.MediaFileLocation; //HDD Folder 
       med.MediaDefault = mm.MediaDefault; //Image to show on listing 
       medias.Add(med); 
      } 
      response.MediaFiles = medias; 
     } 
     return response; 
    } 

所以现在我想创建

public List<MyMovie> GetMovies(string moviename, int movierating, string movieruntime) 

其中将填充所有参数或零长度字符串。如果他们有一个值,我想添加它作为where子句的一部分。

所以基本上更新

   var query = (from oData in DbContext.Movies 
         where oData.MovieId == movieId 
         select oData).ToList(); 

  var query = (from oData in DbContext.Movies 
         where 1=1 
        if(String.IsSafe(moviename)) 
        { 
         && oData.MovieName Like %movieId% 
        } 
        if(movierating != 0) 
        { 
         && oData.MovieRating = movierating 
        } 
        if(String.IsSafe(movieruntime)) 
        { 
         && oData.MovieRuntime == movieruntime 
        } 
         select oData).ToList(); 

相当于展望这个刚刚困惑我更多,我一直用好老ADO.NET,的DataReader writen我的数据层,适配器,存储过程等,但在这个项目中,我被要求使用EF。这让我很困惑。他们怎么说老狗和新花样?

任何与此有关的帮助将非常感激。

回答

4

IQueryable是你的朋友在这里。它允许在多个步骤中组合查询,但它不会生成SQL并在需要之前执行它(例如由于迭代或ToList()调用)。所以你的代码看起来像:

var query = (from oData in DbContext.Movies select oData); 
if (!string.IsNullOrEmpty(moviename)) 
    query = query.Where(m => m.MovieName.Contains(moviename)); 
... 
+0

完美!这三条线为我节省了很多时间。非常感谢 – Fred