从DBML读取值(具有存储过程)

时间:2013-01-27 04:36:27

标签: asp.net asp.net-mvc

我有一个dbml,它拖延了存储过程。我有一个具有get和set属性的EmployeeModel类。

我有一个接口IEmployee和一个Repository Employee Repository,它具有方法的实现。请参考code.In存储过程GetRoles我只有SELECT * FROM ROLE。

在存储库中如何遍历结果集。可以将ISingleResult更改为dbml designer文件中的IMultipleResult吗?

EmployeeModel.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcWebsite.Models
{
    public class EmployeeModel
    {
        public int RoleId { get; set; }
        public string RoleName { get; set; }
        public string Description { get; set; }
        public string TaskMark { get; set; }
        public int RoleFlag { get; set; }
    }
}

IEmployee:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MvcWebsite.Models;

namespace MvcWebsite.DAL
{
    public interface IEmployees
    {
        IList<EmployeeModel> ListAll();
        // void Save(EmployeeModel employ);
    }
}

EmployeeRepository.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MvcWebsite.Models;
using System.Data.Linq;

namespace MvcWebsite.DAL
{
    public class EmployeeRepository:IEmployees
    {

        private DataDataContext _dataContext;

        public EmployeeRepository()
        {
            _dataContext = new DataDataContext();
        }


        public IList<EmployeeModel> ListAll()
        {
            //IMultipleResults result =_dataContext.GetRoleDetails();
            //var Emps = result.GetResult(EmployeeModel);
            List<EmployeeModel> emp = _dataContext.GetRoleDetails();
            // foreach (GetRoleDetailsResult role in Emps)
            // {
            // role.Description=Emps.

            // }
            return Emps.ToList();

        }
    }
}

1 个答案:

答案 0 :(得分:0)

您可以按如下方式遍历结果集:

        List<EmployeeModel> employeeModels = new List<EmployeeModel>();
        foreach (EmployeeModel employeeModel in _dataContext.GetRoleDetails())
        {
            employeeModels.Add(employeeModel);
        }

或者您可以使用System.Linq.Enumerable类ToList&lt;&gt;方法如下:

List<Product> products = context.GetProducts().ToList<Product>();

当存储过程返回多个结果集时,使用IMultipleResults。但是,当您将此类过程放到设计器上时,它不会生成IMultipleResults。为此,您可以更改设计器生成的代码以使用IMultipleResults,如下所示:

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.GetCustomerAndProducts")]
[ResultType(typeof(Customer))]
[ResultType(typeof(Product))]
public IMultipleResults GetCustomerAndProducts()
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
    return ((IMultipleResults)(result.ReturnValue));
}

但是,当您在设计器中进行任何更改时,它会覆盖您的修改,因为它会重新生成代码。为避免这种情况,您可以使用部分类。

或者您也可以使用SqlMetal工具。它是一个命令行工具,可为.NET Framework的LINQ to SQL组件生成代码和映射。该工具生成IMultipleResults。您可以在此处获取此工具的详细信息:

http://msdn.microsoft.com/en-us/library/bb386987.aspx

编辑:

无论您在ASP.Net Mvc或WinForms或任何其他表示层中工作,存储库功能都是相同的。

您可以将存储库功能更改为:

public List<EmployeeModel> ListAll()
{
    return _dataContext.GetRoleDetails().ToList<EmployeeModel>();
}

或者:

public List<EmployeeModel> ListAll()
{
    List<EmployeeModel> employeeModels = new List<EmployeeModel>();
    foreach (EmployeeModel employeeModel in _dataContext.GetRoleDetails())
    {
        employeeModels.Add(employeeModel);
    }

    return employeeModels;
}