1

このプロジェクト/チュートリアルを見つけました:

http://www.codeproject.com/Articles/325103/MVC-Grid-to-Excel-file-download

そして、それはうまくいきます!しかし、私はそれを1つのモデルでしか動作させることができません. したがって、組織モデルだけを取り込んでいる場合、うまく機能します。ただし、SQL クエリを実行して GridView を埋める必要があります。LINQ to SQL が機能すると思っていましたが、わかりません。

これにより、GridView に組織モデルのデータが読み込まれ、ビューに送信されます。

private VAGTCEntities db = new VAGTCEntities();
public ActionResult Index()
{
    ViewBag.Message = "Welcome to ASP.NET MVC!";
    List<Organization> model = db.Organizations.ToList();

    GridView gv = new GridView();
    gv.DataSource = model;
    gv.DataBind();
    Session["Organizations"] = gv;

    return View(model);
}

ビューは通常のものです。

@model IEnumerable<VAGTC.Models.Organization>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Download File", "Download")
</p>
<table>
    <tr>
        <th>
            Organization ID
        </th>
        <th>
            Organization Name
        </th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @item.OrganizationID
        </td>
        <td>
            @item.Name
        </td>
    </tr>
}

</table>

ダウンロード リンクをクリックすると、何らかの Javascript を呼び出す Actionresult が呼び出されます。

public ActionResult Download()
{
    if (Session["Organizations"] != null)
    {
        return new DownloadFileActionResult((GridView)Session["Organizations"], "Organizations.xls");
    }
    else
    {
        return new JavaScriptResult();
    }
}

単純!しかし、LINQ to SQL クエリを使用する方法がわかりません。複数のテーブルを参照できるようにする必要があります。たとえば、組織名 (Organization) とともに、特定の郡と州 (OrganizationAddress) 内の組織のすべての住所を取得します。ViewModel を使用する必要があると考えましたが、それでも埋めることができませんでした。

組織モデル:

namespace VAGTC.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    public partial class Organization
    {
        public Organization()
        {
            this.ContactMTMOrganizations = new HashSet<ContactMTMOrganization>();
            this.ContactTitles = new HashSet<ContactTitle>();
            this.OrganizationAddresses = new HashSet<OrganizationAddress>();
            this.OrganizationBusinessTypes = new HashSet<OrganizationBusinessType>();
            this.OrganizationCountries = new HashSet<OrganizationCountry>();
            this.OrganizationEmails = new HashSet<OrganizationEmail>();
            this.OrganizationIndustryCodes = new HashSet<OrganizationIndustryCode>();
            this.OrganizationMemberships = new HashSet<OrganizationMembership>();
            this.OrganizationNotes = new HashSet<OrganizationNote>();
            this.OrganizationPhones = new HashSet<OrganizationPhone>();
            this.OrganizationWebsites = new HashSet<OrganizationWebsite>();
        }

        [Display(Name = "Organization ID:")]
        public int OrganizationID { get; set; }
        [Display(Name = "Organization Name:")]
        public string Name { get; set; }

        public virtual ICollection<ContactMTMOrganization> ContactMTMOrganizations { get; set; }
        public virtual ICollection<ContactTitle> ContactTitles { get; set; }
        public virtual ICollection<OrganizationAddress> OrganizationAddresses { get; set; }
        public virtual ICollection<OrganizationBusinessType> OrganizationBusinessTypes { get; set; }
        public virtual ICollection<OrganizationCountry> OrganizationCountries { get; set; }
        public virtual ICollection<OrganizationEmail> OrganizationEmails { get; set; }
        public virtual ICollection<OrganizationIndustryCode> OrganizationIndustryCodes { get; set; }
        public virtual ICollection<OrganizationMembership> OrganizationMemberships { get; set; }
        public virtual ICollection<OrganizationNote> OrganizationNotes { get; set; }
        public virtual ICollection<OrganizationPhone> OrganizationPhones { get; set; }
        public virtual ICollection<OrganizationWebsite> OrganizationWebsites { get; set; }
    }
}

OrganizationAddress モデル:

namespace VAGTC.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;

    public partial class OrganizationAddress
    {
        [Display(Name = "Street:")]
        public string StreetID { get; set; }
        [Display(Name = "City:")]
        public string CityID { get; set; }
        [Display(Name = "Organization ID:")]
        public int OrganizationID { get; set; }
        [Display(Name = "Country:")]
        public string CountryNameID { get; set; }
        [Display(Name = "County:")]
        public string CountyNameID { get; set; }
        [Display(Name = "County State:")]
        public string CountyStateID { get; set; }
        [Display(Name = "State:")]
        public string State { get; set; }
        [Display(Name = "Zip-code:")]
        public string ZipCode { get; set; }
        [Display(Name = "Address Type:")]
        public string Type { get; set; }

        public virtual Country Country { get; set; }
        public virtual County County { get; set; }
        public virtual Organization Organization { get; set; }

        public string FullAddress
        {
            get
            {
                return StreetID + ", " + CityID + ", " + State + " " + ZipCode + ", " + CountryNameID;
            }
        }
        public string FullCounty
        {
            get
            {
                return CountyNameID + ", " + CountyStateID;
            }
        }

    }
}

正しい方向へのキックを高く評価します!

どうもありがとうございました!

編集*

要約すると、次のようなリストにデータを入力できるようになると思います。

List<Organization> model = db.Organizations.ToList();

しかし、複数のテーブルから。まだViewModelをいじっていますが、Linq to SQLでViewModelを設定する方法がわからないため、空白になります。

4

1 に答える 1

1

基本的に、エンティティ間の SQL 結合と同等の処理を行う必要があります。遅延読み込みが有効になっている場合は、メインの組織エンティティに関連するすべてのエンティティに自動的にアクセスできます。そうでない場合は、熱心な読み込みを使用して同じデータにアクセスできます (db.Organizations.Include(o => o.OrganizationAddress).ToList()例を使用)。

または、Linq to Entities Join メソッドを使用できます。ViewModel を使用する場合は、組織および関連エンティティから関心のあるプロパティを格納できるクラスを作成することができます。エンティティ オブジェクトからプロパティを設定するだけです (この場合は、Organizations コレクションの各アイテムに対して)。

于 2012-11-28T22:11:38.537 に答える