2

長年の潜伏者、最近の新人。

LINQ-to-Entities を使用したクエリで少し苦労しています。Web および Entity Framework 4.0 用に Visual Studio Express 2012 を使用しています。私がすべてをカバーしていることを確認するために、それは長い説明です。状況は次のとおりです。

イメージ マネージャーとして機能する再利用可能な .aspx ページがあります。Ajax Toolkit FileUpload コントロールと、アップロードされたファイルを表示するための Repeater があります。Fancybox Modal Pop-up (iframe) 内でこの Manager にアクセスします。URLを開くには、「ID」と「タイプ」の2つのパラメーターがあります。

私の ImageManager コード ビハインド ファイルには、すべての画像をリピーターにバインドする関数があります。この関数では、"Type" (url パラメーター) に従ってデータベース テーブルをクエリする必要があります。まさにそこに問題があります。

私の人生では、テーブル名が変更され、タイプに応じて変更される動的な LINQ-to-Entities クエリを作成する方法がわかりません...

関数は次のとおりです(問題のある部分にはコメントがあります):

private void BindImagesRepeater()
{
    DatabaseEntities db = new DatabaseEntities();
    FolderName = Session["foldername"].ToString();
    FolderPath = Server.MapPath("~") + "controls/" + FolderName + "/images";
    int itemid = Convert.ToInt32(Session["itemID"]);
    bool dirExist = Directory.Exists(@FolderPath + "/" + itemid);
    bool isSpotlight = false;
    string spotlightThumbPath = "";
    string thumbPath = "";
    string thumbname = "";
    string spotlightName = "";
    int thumbPosition = 0;
    int spotlightPosition = 0;
    int counter = 0;
    int rptrCount = 0;

    /////PART I DON'T QUITE UNDERSTAND
    var query = null; //I know this is impossible

    //select the Table to query
    switch (FolderName)
    {
        case "NewsManager":
            query = (from q in db.News Where q.ID == itemID select q);
            break;
        case "ProductsManager":
            query = (from q in db.Products Where ...
            break;
        case "ProjectsManager":
            query = ... db.Projects ...
            break;
        case "CalendarManager":
            query = ... db.Events ...
            break;
    }
    /////


    if (query.Count > 0)
    {
        var uniqueItm = query.First();

        isSpotlight = Convert.ToBoolean(uniqueItm.isSpotlight);
        thumbPath = uniqueItm.thumbnailPath;
        spotlightThumbPath = uniqueItm.spotlightThumbPath;

        thumbname = Path.GetFileNameWithoutExtension(thumbPath);
        spotlightName = Path.GetFileNameWithoutExtension(spotlightThumbPath);

        if (dirExist)
        {
            if (!String.IsNullOrWhiteSpace(FolderPath))
            {
                List<string> fileNames = GetFiles(FolderPath + "/" + itemid, "*.bmp|*.gif|*.jpg|*.jpeg|*.png", SearchOption.TopDirectoryOnly);
                var files = (from f in fileNames
                             where (!f.Contains("_Thumb")) && (!f.Contains("_SpotlightThumb"))
                             select new
                             {
                                 FilePath = f,
                                 FileName = System.IO.Path.GetFileName(f)
                             });

                if (files.Count() > 0)
                {
                    imagesRepeater.DataSource = files;
                    imagesRepeater.DataBind();

                    foreach (var img in files)
                    {

                        if (thumbPath != "" && thumbPath != null)
                        {
                            if (img.FileName.Contains(thumbname.Replace("_Thumb", "")))
                            {
                                thumbPosition = counter;
                            }
                        }

                        if (spotlightThumbPath != "" && spotlightThumbPath != null)
                        {
                            if (img.FileName.Contains(spotlightName.Replace("_SpotlightThumb", "")))
                            {
                                spotlightPosition = counter;
                            }
                        }

                        counter++;
                    }

                    if (isSpotlight)
                    {
                        foreach (RepeaterItem item in imagesRepeater.Items)
                        {
                            LinkButton spotlightLnkBtn = (LinkButton)item.FindControl("useAsThumbnailSpotlight");
                            spotlightLnkBtn.Visible = true;

                            if (thumbPath != "" && thumbPath != null)
                            {
                                if (rptrCount == thumbPosition)
                                {
                                    Label myThumbImage = (Label)item.FindControl("lblThumb");
                                    myThumbImage.Visible = true;
                                }
                            }

                            if (spotlightThumbPath != "" && spotlightThumbPath != null)
                            {
                                if (rptrCount == spotlightPosition)
                                {
                                    Label mySpotlightImage = (Label)item.FindControl("lblThumbSpotlight");
                                    mySpotlightImage.Visible = true;
                                }
                            }

                            rptrCount++;
                        }
                    }
                    else
                    {
                        foreach (RepeaterItem item in imagesRepeater.Items)
                        {
                            if (thumbPath != "" && thumbPath != null)
                            {
                                if (rptrCount == thumbPosition)
                                {
                                    Label myThumbImage = (Label)item.FindControl("lblThumb");
                                    myThumbImage.Visible = true;
                                }
                            }

                            if (spotlightThumbPath != "" && spotlightThumbPath != null)
                            {
                                if (rptrCount == spotlightPosition)
                                {
                                    Label mySpotlightImage = (Label)item.FindControl("lblThumbSpotlight");
                                    mySpotlightImage.Visible = true;
                                }
                            }

                            rptrCount++;
                        }
                    }

                    uniqueItm.hasImages = true;
                    db.SaveChanges();
                    lblEmptyData.Visible = false;
                }
                else
                {
                    uniqueItm.hasImages = false;
                    db.SaveChanges();
                    lblEmptyData.Visible = true;
                }
            }
        }
    }
    else
    {
        lblEmptyData.Visible = true;
    }
}

私は役に立たなかったいくつかの異なることを試しました。私はちょっと困惑しています。それを解決する「varクエリ」をNULLにできれば、もちろん、この変数は暗黙的に型指定されているため、これは不可能です。

「var」を使用する以外に、変数を宣言する方法が必要です...

誰かが何か考えを持っているなら、私は本当に感謝しています. 私は十分に簡潔だったことを願っています。

前もって感謝します

4

2 に答える 2

0

実際、私は頭の上に解決策を持っているかもしれません:

注: ソリューションはテストされていません。

初め:

あなたの場合、var resultあなたが言ったように、暗黙的に型付けされます。しかし、実際には と同等IEnumerable<object> resultです。IEnumerable<object> result = null代わりにorを使用IEnumerable<object­>? resultして、null 許容値を受け入れることができます。

2番:

2 番目の解決策は、クエリ部分を独自のメソッドに移動し、文字列パラメーターを受け入れ、オブジェクト コレクションまたは null 許容IEnumerable<T>?コレクションを返すことです。

よろしく!

于 2013-05-08T02:52:17.097 に答える