在MVC5 / EF应用程序中实现动态查询LINQ? [英] Implementing Dynamic LINQ querying in MVC5/EF Application?

查看:269
本文介绍了在MVC5 / EF应用程序中实现动态查询LINQ?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

作为概述我试图导出()功能添加到我的应用程序 - 允许用户指定某型号字段和仅导出这些字段中的值与LINQ查询和使用 EPPlus 库导出。我试图根据<一个在我MVC5 / EF code-首次应用实现动态LINQ功能href=\"https://stackoverflow.com/questions/11096029/i-need-to-select-particular-column-based-on-check-box-list\">THIS例子,但似乎缺少一些东西得到它的工作,或不理解的东西。

As an overview I am attempting to add Export() functionality to my application -- allowing the user to specify certain model fields and only export the values in those fields by querying with LINQ and using the EPPlus library to Export. I am attempting to implement Dynamic LINQ functionality in my MVC5/EF Code-First application based on THIS example, but seem to be missing some things to get it working or not understanding something.

首先,我增加了一个新的类文件,我称为主项目文件夹 DynamicLibrary.cs 。当我下载.zip 这里,我相信的code,我想是的Dynamic.cs 文件code,我在我的项目复制到 DynamicLibrary.cs 。这样做让我引用在我的项目中使用System.Linq.Dynamic

First I added a new class file to my main project folder called DynamicLibrary.cs. When I download the .zip HERE, I "believe" the code I wanted was the Dynamic.cs file code which I copied into DynamicLibrary.cs in my project. Doing this allowed me to reference using System.Linq.Dynamic in my project.

现在我卡试图弄清楚如何设置动态LINQ休息。

Now I'm stuck trying to figure out how to setup the rest for Dynamic LINQ.

在我的 ExportController 命名空间内InventoryTracker.Controllers {} 但外界公开类ExportController:控制器{} 我说根据我的 INV_Assets 模型我试图出口领域的例子code:

In my ExportController within the namespace InventoryTracker.Controllers {} but outside the public class ExportController : Controller { } I added the example code based upon the fields in my INV_Assets model I am attempting to Export:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using InventoryTracker.DAL;
using OfficeOpenXml;
using InventoryTracker.Models;
using System.Linq.Dynamic;


namespace InventoryTracker.Controllers
{
    public class ExportController : Controller
    {
        InventoryTrackerContext _db = new InventoryTrackerContext();

        // GET: Export
        public ActionResult Index()
        {
            ExportAssetsViewModel expViewMod = new ExportAssetsViewModel();
            return View(expViewMod);
        }

        public ActionResult Export()
        {
            GridView gv = new GridView();
            gv.DataSource = _db.INV_Assets.ToList();
            gv.DataBind();
            Response.ClearContent();
            Response.Buffer = true;
            Response.AddHeader("content-disposition", "attachment; filename=InventoryAssets-" + DateTime.Now + ".xls");
            Response.ContentType = "application/ms-excel";
            Response.Charset = "";
            StringWriter sw = new StringWriter();
            HtmlTextWriter htw = new HtmlTextWriter(sw);
            gv.RenderControl(htw);
            Response.Output.Write(sw.ToString());
            Response.Flush();
            Response.End();

            return RedirectToAction("StudentDetails");
        }

        [HttpPost]
        public ActionResult ExportUsingEPPlus(ExportAssetsViewModel model)
        {
            //FileInfo newExcelFile = new FileInfo(output);
            ExcelPackage package = new ExcelPackage();
            var ws = package.Workbook.Worksheets.Add("TestExport");  

            var exportFields = new List<string>();
            foreach(var selectedField in model.SelectedFields)
            {
                // Adds selected fields to [exportFields] List<string>
                exportFields.Add(model.ListOfExportFields.First(s => s.Key == selectedField).Value);
            }

            // Loops to insert column headings into Row 1 of Excel
            for (int i = 0; i < exportFields.Count(); i++ )
            {
                ws.Cells[1, i + 1].Value = exportFields[i].ToString();
            }

            // INVALID - Need to query table INV_Assets for all values of selected fields and insert into appropriate columns.
            if (exportFields.Count() > 0)
            {
                var exportAssets = from ia in _db.INV_Assets
                                   select new {
                                       ia.ip_address,

                                   }
                ws.Cells["A2"].LoadFromCollection(exportFields);
            }

            var memoryStream = new MemoryStream();
            package.SaveAs(memoryStream);

            string fileName = "Exported-InventoryAssets-" + DateTime.Now + ".xlsx";
            string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

            memoryStream.Position = 0;
            return File(memoryStream, contentType, fileName);
        }

    }

    public class DynamicColumns : INV_Assets
    {
        //public int Id { get; set; }
        //public int Model_Id { get; set; }
        public virtual INV_Models Model { get; set; }
        //public int Manufacturer_Id { get; set; }
        public virtual INV_Manufacturers Manufacturer { get; set; }
        //public int Type_Id { get; set; }
        public virtual INV_Types Type { get; set; }
        //public int Location_Id { get; set; }
        public virtual INV_Locations Location { get; set; }
        //public int Vendor_Id { get; set; }
        public virtual INV_Vendors Vendor { get; set; }
        //public int Status_Id { get; set; }
        public virtual INV_Statuses Status { get; set; }
        public string ip_address { get; set; }
        public string mac_address { get; set; }
        public string note { get; set; }
        public string owner { get; set; }
        public decimal cost { get; set; }
        public string po_number { get; set; }
        public string description { get; set; }
        public int invoice_number { get; set; }
        public string serial_number { get; set; }
        public string asset_tag_number { get; set; }
        public DateTime? acquired_date { get; set; }
        public DateTime? disposed_date { get; set; }
        public DateTime? verified_date { get; set; }
        public DateTime created_date { get; set; }
        public string created_by { get; set; }
        public DateTime? modified_date { get; set; }
        public string modified_by { get; set; }
    }

    public enum EnumTasks
    {
        Model = 1,
        Manufacturer = 2,
        Type = 3,
        Location = 4,
        Vendor = 5,
        Status = 6,
        ip_address = 7,
        mac_address = 8,
        note = 9,
        owner = 10,
        cost = 11,
        po_number = 12,
        description = 13,
        invoice_number = 14,
        serial_number = 15,
        asset_tag_number = 16,
        acquired_date = 17,
        disposed_date = 18,
        verified_date = 19,
        created_date = 20,
        created_by = 21,
        modified_date = 22,
        modified_by = 23
    }

     public IQueryable DynamicSelectionColumns()
    {
        using (var db = new TrackerDataContext())
        {
            string fieldIds = "," + "4,5,3,2,6,17,11,12" + ",";

            var taskColum = Enum.GetValues(typeof(EnumTasks)).Cast<EnumTasks>().Where(e => fieldIds.Contains("," + ((int)e).ToString() + ",")).Select(e => e.ToString().Replace("_", ""));

            string select = "new (  TaskId, " + (taskColum.Count() > 0 ? string.Join(", ", taskColum) + ", " : "") + "Id )";

            return db.Task.ToList().Select(t => new DynamicColumns() { Id = t.Id, TaskId = Project != null ? Project.Alias + "-" + t.Id : t.Id.ToString(), ActualTime = t.ActualTime, AssignedBy = t.AssignedBy.ToString(), AssignedDate = t.AssignedDate, AssignedTo = t.AssignedTo.ToString(), CreatedDate = t.CreatedDate, Details = t.Details, EstimatedTime = t.EstimatedTime, FileName = t.FileName, LogWork = t.LogWork, Module = t.Module != null ? t.Module.Name : "", Priority = t.Priority != null ? t.Priority.Name : "", Project = t.Project != null ? t.Project.Name : "", ResolveDate = t.ResolveDate, Status = t.Status != null ? t.Status.Name : "", Subject = t.Subject, TaskType = t.TaskType != null ? t.TaskType.Type : "", Version = t.Version != null ? t.Version.Name : "" }).ToList().AsQueryable().Select(select);
        }
    }
}

我不知道100%,这是建立在正确的位置。下面最后一个方法有5个错误:

I am not 100% sure this is set up in the right location. The last method below has 5 errors:


  • 的IQueryable - 预计类,委托,枚举,接口或结构

  • InventoryTrackerContext - 预计类,委托,枚举,接口或结构

  • DynamicColumns() - 预计类,委托,枚举,接口或结构

  • 关闭} 公开IQueryable的DynamicSelectionColumns() - 类型或命名空间的定义,或档案结尾的预期。

  • 关闭} 命名空间InventoryTracker.Controllers - 类型或命名空间的定义或档案结尾的预期。

  • IQueryable - Expected class, delegate, enum, interface, or struct.
  • InventoryTrackerContext - Expected class, delegate, enum, interface, or struct.
  • DynamicColumns() - Expected class, delegate, enum, interface, or struct.
  • Closing } for public IQueryable DynamicSelectionColumns() - Type or namespace definition, or end-of-file expected.
  • Closing } for namespace InventoryTracker.Controllers - Type or namespace definition, or end-of-file expected.

public IQueryable DynamicSelectionColumns()
{
    using (var db = new InventoryTrackerContext())
    {
        string fieldIds = "," + "4,5,3,2,6,17,11,12" + ",";

        var taskColum = Enum.GetValues(typeof(EnumTasks)).Cast<EnumTasks>().Where(e => fieldIds.Contains("," + ((int)e).ToString() + ",")).Select(e => e.ToString().Replace("_", ""));

        string select = "new (  TaskId, " + (taskColum.Count() > 0 ? string.Join(", ", taskColum) + ", " : "") + "Id )";

        return db.Task.ToList().Select(t => new DynamicColumns() { Id = t.Id, TaskId = Project != null ? Project.Alias + "-" + t.Id : t.Id.ToString(), ActualTime = t.ActualTime, AssignedBy = t.AssignedBy.ToString(), AssignedDate = t.AssignedDate, AssignedTo = t.AssignedTo.ToString(), CreatedDate = t.CreatedDate, Details = t.Details, EstimatedTime = t.EstimatedTime, FileName = t.FileName, LogWork = t.LogWork, Module = t.Module != null ? t.Module.Name : "", Priority = t.Priority != null ? t.Priority.Name : "", Project = t.Project != null ? t.Project.Name : "", ResolveDate = t.ResolveDate, Status = t.Status != null ? t.Status.Name : "", Subject = t.Subject, TaskType = t.TaskType != null ? t.TaskType.Type : "", Version = t.Version != null ? t.Version.Name : "" }).ToList().AsQueryable().Select(select);
    }
}


任何人有更多经验,在这种事情可称重?我还检查了 ScottGu的博客,但似乎缺少或不理解的东西。

Can anyone with more experience in this kind of thing weigh-in? I also checked out ScottGu's Blog, but seem to be missing or not understanding something.

修改

绝密FOR空间

EDIT2

使用从 DynamicSelectionColumns()的返回进入我的变量 selectStatement ,我有以下的codeD:

Using the return from DynamicSelectionColumns() into my variable selectStatement, I have the following coded:

    public IQueryable DynamicSelectionColumns(List<string> fieldsForExport)
    {
        using (var db = new InventoryTrackerContext())
        {
            string fieldIds = "," + "4,5,3,2,6,17,11,12" + ",";

            var taskColum = Enum.GetValues(typeof(EnumTasks)).Cast<EnumTasks>().Where(e => fieldIds.Contains("," + ((int)e).ToString() + ",")).Select(e => e.ToString().Replace("_", ""));

            //string select = "new (  TaskId, " + (taskColum.Count() > 0 ? string.Join(", ", taskColum) + ", " : "") + "Id )";
            string select = "new (  " + string.Join(", ", fieldsForExport) + ")";

            //return db.INV_Assets.ToList().Select(t => new DynamicColumns() { Id = t.Id, TaskId = Project != null ? Project.Alias + "-" + t.Id : t.Id.ToString(), 
             return db.INV_Assets.ToList().Select(t => new DynamicColumns() { 
                Id = t.Id, 
                Manufacturer = Convert.ToString(t.Manufacturer.manufacturer_description), 
                Type = t.Type.type_description, 
                Location = t.Location.location_room, 
                Vendor = t.Vendor.vendor_name, 
                Status = t.Status.status_description, 
                ip_address = t.ip_address, 
                mac_address = t.mac_address, 
                note = t.note, 
                owner = t.owner, 
                //Module = t.Module != null ? t.Module.Name : "", 
                cost = t.cost,
                po_number = t.po_number,
                description = t.description,
                invoice_number = t.invoice_number,
                serial_number = t.serial_number,
                asset_tag_number = t.asset_tag_number,
                acquired_date = t.acquired_date,
                disposed_date = t.disposed_date,
                verified_date = t.verified_date,
                created_date = t.created_date,
                created_by = t.created_by,
                modified_date = t.modified_date,
                modified_by = t.modified_by
            }).ToList().AsQueryable().Select(select);
        }
    }

    [HttpPost]
    public ActionResult ExportUsingEPPlus(ExportAssetsViewModel model)
    {
        ExcelPackage package = new ExcelPackage();
        var ws = package.Workbook.Worksheets.Add("TestExport");  

        var exportFields = new List<string>();
        foreach(var selectedField in model.SelectedFields)
        {
            // Adds selected fields to [exportFields] List<string>
            exportFields.Add(model.ListOfExportFields.First(s => s.Key == selectedField).Value);
        }

        var selectStatement = DynamicSelectionColumns(exportFields);

        // Loops to insert column headings into Row 1 of Excel
        for (int i = 0; i < exportFields.Count(); i++ )
        {
            ws.Cells[1, i + 1].Value = exportFields[i].ToString();
        }

        if (selectStatement.Count() > 0)
        {
            ws.Cells["A2"].LoadFromCollection(selectStatement.ToString());
        }

        var memoryStream = new MemoryStream();
        package.SaveAs(memoryStream);

        string fileName = "Exported-InventoryAssets-" + DateTime.Now + ".xlsx";
        string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        memoryStream.Position = 0;
        return File(memoryStream, contentType, fileName);
    }

这会产生一个列[IP地址]一个Excel输出,[MAC_ADDRESS],[注],[所有者]和[费用](在I选定字段),但没有数据。相反的数据,我得到251行 0 的A列,并没有什么其他的。

This yields an Excel output with columns [ip_address], [mac_address], [note], [owner], and [cost] (the fields I selected), but no data. Instead of data, I get 251 rows of 0 in column A and nothing in the others.

我如何实现动态选择查询结果到我的Excel US preadsheet?

How do I implement the dynamic select query results into my Excel spreadsheet?

EDIT3

ThulasiRam 的建议(以下ExportController):

Attempting ThulasiRam's suggestion (ExportController below):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using InventoryTracker.DAL;
using OfficeOpenXml;
using InventoryTracker.Models;
using System.Linq.Dynamic;


namespace InventoryTracker.Controllers
{
    public class ExportController : Controller
    {
        InventoryTrackerContext _db = new InventoryTrackerContext();
        public static List<DynamicColumns> DynamicColumnsCollection = new List<DynamicColumns>();

        [HttpPost]

公众的ActionResult ExportUsingEPPlus(ExportAssetsViewModel模型)
    {
        // FileInfo的newExcelFile =新的FileInfo(输出);
        ExcelPackage包=新ExcelPackage();
        变种WS = package.Workbook.Worksheets.Add(TestExport);

public ActionResult ExportUsingEPPlus(ExportAssetsViewModel model) { //FileInfo newExcelFile = new FileInfo(output); ExcelPackage package = new ExcelPackage(); var ws = package.Workbook.Worksheets.Add("TestExport");

    var exportFields = new List<string>();
    foreach(var selectedField in model.SelectedFields)
    {
        // Adds selected fields to [exportFields] List<string>
        exportFields.Add(model.ListOfExportFields.First(s => s.Key == selectedField).Value);
    }

    int cnt = 0;
    foreach(var column in exportFields)
    {
        DynamicColumnsCollection.Add(new DynamicColumns()
        {
            Id = cnt,

            ip_address = "ip_address" + cnt,
            mac_address = "mac_address" + cnt,
            note = "note" + cnt,
            owner = "owner" + cnt,
            cost = "cost" + cnt,
            po_number = "po_number" + cnt,
            description = "description" + cnt,
            invoice_number = "invoice_number" + cnt,
            serial_number = "serial_number" + cnt,
            asset_tag_number = "asset_tag_number" + cnt,
            acquired_date = "acquired_date" + cnt,
            disposed_date = "disposed_date" + cnt,
            verified_date = "verified_date" + cnt,
            created_date = "created_date" + cnt,
            created_by = "created_by" + cnt,
            modified_date = "modified_date" + cnt,
            modified_by = "modified_by" + cnt
        });
    }

    //var selectStatement = DynamicSelectionColumns(exportFields);
    IQueryable collection = DynamicSelectionColumns(new List<string>() {
        "id",
        "owner",
        "note"
    });

    // Loops to insert column headings into Row 1 of Excel
    for (int i = 0; i < exportFields.Count(); i++ )
    {
        ws.Cells[1, i + 1].Value = exportFields[i].ToString();
    }

    ws.Cells["A2"].LoadFromCollection(collection.ToString());

    //    ws.Cells["A2"].LoadFromCollection(selectStatement.ToString());

    var memoryStream = new MemoryStream();
    package.SaveAs(memoryStream);

    string fileName = "Exported-InventoryAssets-" + DateTime.Now + ".xlsx";
    string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

    memoryStream.Position = 0;
    return File(memoryStream, contentType, fileName);
}

        public IQueryable DynamicSelectionColumns(List<string> fieldsForExport)
        {
            using (var db = new InventoryTrackerContext())
            {

                if (!fieldsForExport.Any())
                {
                    return null;
                }

                string select = string.Format("new ( {0} )", string.Join(", ", fieldsForExport.ToArray()));

                var collection = DynamicColumnsCollection.Select(t => new DynamicColumns()
                    {
                        Id = t.Id,
                        //Manufacturer = Convert.ToString(t.Manufacturer.manufacturer_description),
                        //Type = t.Type.type_description,
                        //Location = t.Location.location_room,
                        //Vendor = t.Vendor.vendor_name,
                        //Status = t.Status.status_description,
                        ip_address = t.ip_address,
                        mac_address = t.mac_address,
                        note = t.note,
                        owner = t.owner,
                        //Module = t.Module != null ? t.Module.Name : "", 
                        cost = t.cost,
                        po_number = t.po_number,
                        description = t.description,
                        invoice_number = t.invoice_number,
                        serial_number = t.serial_number,
                        asset_tag_number = t.asset_tag_number,
                        acquired_date = t.acquired_date,
                        disposed_date = t.disposed_date,
                        verified_date = t.verified_date,
                        created_date = t.created_date,
                        created_by = t.created_by,
                        modified_date = t.modified_date,
                        modified_by = t.modified_by
                    }).ToList().AsQueryable().Select(select);

                return collection;


        }

    }

    public class DynamicColumns : INV_Assets
    {
        public string Model { get; set; }
        public string Manufacturer { get; set; }
        public string Type { get; set; }
        public string Location { get; set; }
        public string Vendor { get; set; }
        public string Status { get; set; }
        public string ip_address { get; set; }
        public string mac_address { get; set; }
        public string note { get; set; }
        public string owner { get; set; }
        public string cost { get; set; }
        public string po_number { get; set; }
        public string description { get; set; }
        public string invoice_number { get; set; }
        public string serial_number { get; set; }
        public string asset_tag_number { get; set; }
        public string acquired_date { get; set; }
        public string disposed_date { get; set; }
        public string verified_date { get; set; }
        public string created_date { get; set; }
        public string created_by { get; set; }
        public string modified_date { get; set; }
        public string modified_by { get; set; }
    }

    public enum EnumTasks
    {
        Model = 1,
        Manufacturer = 2,
        Type = 3,
        Location = 4,
        Vendor = 5,
        Status = 6,
        ip_address = 7,
        mac_address = 8,
        note = 9,
        owner = 10,
        cost = 11,
        po_number = 12,
        description = 13,
        invoice_number = 14,
        serial_number = 15,
        asset_tag_number = 16,
        acquired_date = 17,
        disposed_date = 18,
        verified_date = 19,
        created_date = 20,
        created_by = 21,
        modified_date = 22,
        modified_by = 23
    }

我可以不是我的MVC应用程序内找出是哪里把这个相关的片code从他们的建议(或设置它):

What I can't figure out is where to put this relevant piece of code from their suggestion (or set it up) within my MVC application:

    static void Main(string[] args)
    {
        IQueryable collection = DynamicSelectionColumns(new List<string>() { "id", "name" });

        Console.ReadLine();
    }

有什么想法?我不知道如何构建静态程序()的Main()在我的MVC的例子中使用应用程序。在上面列出我的code(我应该选择在注意 / 所有者字段),我收到的输出Excel工作表与 A1注意 所有者 B1 ,然后只数 0 细胞 A2:A180 ...

Any thoughts? I'm not sure how to structure the static Program() or Main() used in the example for my MVC app. In my code listed above (should I select just the note/owner field), I receive an output Excel sheet with "note" in A1, "owner" in B1, and then just the number 0 in cells A2:A180...?

推荐答案

你得到的错误无关的LINQ或您导入到项目中的其他库。

The errors you're getting has nothing to do with linq or the other libraries you imported into your project.

你声明函数 DynamicSelectionColumns 在命名空间,而不是在 ExportController 类。

You're declaring the function DynamicSelectionColumns in the namespace, not in the ExportController class.

您的编辑之后:

如果你的 exportFields 已经是任务列表列,可以简单地认为列表传递给 DynamicSelectionColumns 并拥有这里面:

if your exportFields is already a list of Task columns, you can simply pass that list to DynamicSelectionColumns and have this inside:

string select = "new (  " + string.Join(", ", exportFields) + ")";

EDIT2后:

替换

ws.Cells["A2"].LoadFromCollection(selectStatement.ToString());

ws.Cells["A2"].LoadFromCollection(selectStatement, false);

EDIT3后:

在此试错的办法,我决定确实查找你所提到的EPPlus库。我发现的不需要任何本DynamicQuery的。您可以指定到 LoadFromCollection 要显示的字段。
我没有得到这编译(因为它是你的code),但它的工作在我的机器上用假数据。

After this trial and error approaches, I decided to indeed lookup the EPPlus library you mentioned. I found out that you don't need any of this DynamicQuery. You can specify into LoadFromCollection the fields you want to show. I didn't get to compile this (because it's your code) but It worked on my machine with fake data.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.IO;
    using InventoryTracker.DAL;
    using OfficeOpenXml;
    using InventoryTracker.Models;
    using System.Reflection;
    using OfficeOpenXml.Table;


    namespace InventoryTracker.Controllers
    {
        public class ExportController : Controller
        {
            private InventoryTrackerContext _db = new InventoryTrackerContext();

            [HttpPost]
            public ActionResult ExportUsingEPPlus(ExportAssetsViewModel model)
            {
                //FileInfo newExcelFile = new FileInfo(output);
                ExcelPackage package = new ExcelPackage();
                var ws = package.Workbook.Worksheets.Add("TestExport");

                var exportFields = new List<string>();
                foreach (var selectedField in model.SelectedFields)
                {
                    // Adds selected fields to [exportFields] List<string>
                    exportFields.Add(model.ListOfExportFields.First(s => s.Key == selectedField).Value);
                }

                // Loops to insert column headings into Row 1 of Excel
                for (int i = 0; i < exportFields.Count(); i++)
                {
                    ws.Cells[1, i + 1].Value = exportFields[i].ToString();
                }

                var membersToShow = typeof(INV_Asset).GetMembers()
                    .Where(p => exportFields.Contains(p.Name))
                    .ToArray();

                ws.Cells["A2"].LoadFromCollection(_db.INV_Assets.ToList(), false, TableStyles.None, BindingFlags.Default, membersToShow);


                var memoryStream = new MemoryStream();
                package.SaveAs(memoryStream);

                string fileName = "Exported-InventoryAssets-" + DateTime.Now + ".xlsx";
                string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

                memoryStream.Position = 0;
                return File(memoryStream, contentType, fileName);
            }
        }
    }

这篇关于在MVC5 / EF应用程序中实现动态查询LINQ?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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