1

2 つのアプリケーションがあります。

  1. API

  2. Web フォーム アプリ

API で Entity Framework 5 を使用しています。

Web フォーム アプリは API 呼び出しを行い、データを取得します。

何らかの理由で、データを取得すると、まったく同じ行がいくつか表示されます。

ここでの問題は、SQL Server Profiler を使用してクエリを確認すると、クエリが正しく、このクエリを SQL で実行すると結果が正しいことです。ただし、Web フォーム アプリでは、多くのデータが同じように返されます。

これらの 2 つのスクリーンショットを見てください -

アプリケーションの実行:

エンティティ フレームワークによって生成された SQL クエリを取得し、SQL に実行します。

ご覧のとおり、これは私を非常に混乱させています...

ここで何が問題なのか誰にもわかりませんか?

これが私のEFモデルです:

Entity Framework によって生成されたクエリ:

{SELECT 
[Extent1].[dataSource] AS [dataSource], 
[Extent1].[ShowId] AS [ShowId], 
[Extent1].[Title] AS [Title], 
[Extent1].[EpisodeId] AS [EpisodeId], 
[Extent1].[EpisodeTitle] AS [EpisodeTitle], 
[Extent1].[Genre] AS [Genre], 
[Extent1].[ShowTypeDescription] AS [ShowTypeDescription], 
[Extent1].[DirectorName] AS [DirectorName], 
[Extent1].[ReleaseYear] AS [ReleaseYear], 
[Extent1].[SeasonEpisode] AS [SeasonEpisode]
FROM (SELECT 
      [TVData_VW_ShowList].[dataSource] AS [dataSource], 
      [TVData_VW_ShowList].[ShowId] AS [ShowId], 
      [TVData_VW_ShowList].[Title] AS [Title], 
      [TVData_VW_ShowList].[EpisodeId] AS [EpisodeId], 
      [TVData_VW_ShowList].[EpisodeTitle] AS [EpisodeTitle], 
      [TVData_VW_ShowList].[Genre] AS [Genre], 
      [TVData_VW_ShowList].[ShowTypeDescription] AS [ShowTypeDescription], 
      [TVData_VW_ShowList].[DirectorName] AS [DirectorName], 
      [TVData_VW_ShowList].[ReleaseYear] AS [ReleaseYear], 
      [TVData_VW_ShowList].[SeasonEpisode] AS [SeasonEpisode]
      FROM [dbo].[TVData_VW_ShowList] AS [TVData_VW_ShowList]) AS [Extent1]
WHERE [Extent1].[Title] LIKE @p__linq__0 ESCAPE '~'}

デバッグモードに入ってこのクエリを取得しました。実際のデータベースで実行すると、正しい結果が返されます。

コントローラーコード:

public class ShowsController : ApiController { プライベート readonly TVDataEntities db;

public ShowsController()
{
    db = new TVDataEntities();
    db.Configuration.ProxyCreationEnabled = false;
}

public IEnumerable<TVData_VW_ShowList> GetTVData_VW_ShowList(string dataSource = null, string title = null,
                                                             string episodeTitle = null, string genre = null,
                                                             string showTypeDescription = null,
                                                             string directorName = null,
                                                             string releaseYear = null,
                                                             string seasonEpisode = null)
{
    var query = from s in db.TVData_VW_ShowList select s;

    if (dataSource != null)
    {
        if (dataSource != "all")
        {
            query = query.Where(s => s.dataSource.Contains(dataSource));
        }
    }

    if (title != null)
    {
        query = query.Where(s => s.Title.Contains(title));
    }

    if (episodeTitle != null)
    {
        query = query.Where(s => s.EpisodeTitle.Contains(episodeTitle));
    }

    if (genre != null)
    {
        query = query.Where(s => s.Genre.Contains(genre));
    }

    if (showTypeDescription != null)
    {
        query = query.Where(s => s.ShowTypeDescription.Contains(showTypeDescription));
    }

    if (directorName != null)
    {
        query = query.Where(s => s.DirectorName.Contains(directorName));
    }

    if (releaseYear != null)
    {
        query = query.Where(s => s.ReleaseYear.ToString().Contains(releaseYear));
    }

    if (seasonEpisode != null)
    {
        query = query.Where(s => s.SeasonEpisode.Contains(seasonEpisode));
    }

    return query.ToList();
}

}

4

1 に答える 1

0

問題は解決しました。それはLinqクエリでした。

これが正しいものです:

IQueryable<ETSShows> query = from shows in db.ETS_Shows
                                         from episodes in
                                             db.ETS_Episodes.Where(v => v.ShowId == shows.ShowId).DefaultIfEmpty()
                                         from genres in
                                             db.ETS_LKP_Genres.Where(s => s.GenreCode == shows.GenreCode).DefaultIfEmpty()
                                         from showTypes in
                                             db.ETS_LKP_ShowTypes.Where(z => z.ShowTypeCode == shows.ShowTypeCode).DefaultIfEmpty()
                                         from directors in
                                             db.ETS_Directors.Where(p => p.ShowId == shows.ShowId).DefaultIfEmpty()
                                         select new ETSShows
                                             {
                                                 DataSource = "ETS",
                                                 Title = shows.Title,
                                                 EpisodeTitle = episodes.EpisodeTitle,
                                                 Genre = genres.GenreDescription,
                                                 ShowTypeDescription = showTypes.ShowTypeDescription,
                                                 DirectorName = directors.Name,
                                                 ReleaseYear = (int)shows.ReleaseYear,
                                                 SeasonEpisode = episodes.SeasonEpisode,
                                                 ShowId = shows.ShowId,
                                                 EpisodeId = episodes.EpisodeId
                                             };
于 2013-06-22T00:35:57.817 に答える