基于可选搜索参数选择数据使用实体框架 [英] Selecting Data Using Entity Framework based on optional search parameters

查看:94
本文介绍了基于可选搜索参数选择数据使用实体框架的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个使用EF与数据库进行接口的项目。它通过WCF Web服务执行此操作。这是我的第一个EF项目,我正在努力研究如何根据可选参数构建查询。



我的Web服务具有与EF课程。 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>演员;
[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;
}

数据模型(简化)...





我的网络服务方法....

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

使用(MovieDatabaseEntities DbContext = new MovieDatabaseEntities())
{
var query =(从dbContext.Movies中的oData
其中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;
}

列表< 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;

列表< 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; //图片显示在列表上
medias.Add(med);
}
response.MediaFiles = medias;
}
返回响应;
}

所以现在我想创建

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

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



所以基本上更新

  var query =(从DbContext.Movies中的oData 
其中oData.MovieId == movieId
选择oData).ToList();

相当于

  var query =(从DbContext.Movies中的oData 
其中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,DataReaders,适配器,存储Procs等,但是这个项目我被要求使用EF。这让我很困惑他们对老狗和新技巧说什么?



对此的任何帮助将非常感谢。

解决方案

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

  var query =(从DbContext.Movies中的oData选择oData); 
if(!string.IsNullOrEmpty(moviename))
query = query.Where(m => m.MovieName.Contains(moviename));
...


I have a project that using EF to interface with the database. It does this via a WCF web service. This is my first EF project and I am trying to work out how to construct a query based on optional parameters.

My web service has a data contract with matching fields to the classes in EF. The web service wueries the database, populates these client classes an passes them back to the client. For an example....

In the web service

[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;
}

The data model (simplified)...

My web service method....

    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;
    }

So now I want to create

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

Where all parameters will be populated or zero length strings. If they have a values I want to add that as part of the where clause.

so basically update

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

to the equivalent of

            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();

Looking into this has just confused me more, I have always writen my data layers using good old ADO.NET, DataReaders, Adapters, Stored Procs etc but with this project I have been asked to use EF. It is confusing me so much. What is it they say about old dogs and new tricks?!

Any help with this would be very much appreciated.

解决方案

IQueryable is your friend here. It allows for composing the query in multiple steps, but it won't generate the SQL and execute it until it's needed (like due to iteration or a ToList() call). So your code would look like:

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

这篇关于基于可选搜索参数选择数据使用实体框架的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆