簡體   English   中英

IEnumerable與IQueryable對象-LinQ to SQL

[英]IEnumerable vs IQueryable object - LinQ to SQL

最初,我有一個名為“ Employees”的IEnumerable對象,該對象的所有屬性都映射到單個類“ Employee”。

我將IEnumerable對象Employee傳遞給私有方法,該方法通過屬性進行解析並將其映射到數據表。

   private void createEmployeesDataTable(IEnumerable<Employee> Employees)
    {
    .... stuff here to define the datatable ....

       foreach (var elem in Employees)
       {
           var row = dataTable.NewRow();
           row["Name"] = elem.JobTitle;
           row["Address"] = elem.Address;
           row["Phone"] = elem.Phone;
           row["DateOfHire"] = elem.HireDate;
           dataTable.Rows.Add(row);
       }
    }

像魅力一樣工作。

現在,我有一堆類,映射到數據庫,還有一個IQueryable對象Employees。 代碼很簡單。

    DataContext db = new DataContext(System.Configuration.ConfigurationManager.ConnectionStrings["employeeDB"].ConnectionString);
    Table<Employee> Emp = db.GetTable<Employee>();
    Table<Address> Add = db.GetTable<Address>();
    Table<BusinessEntityAddress> BE = db.GetTable<BusinessEntityAddress>();
    Table<Phone> Phone = db.GetTable<Phone>();
    Table<State> State = db.GetTable<State>();

    var Employees =
        from Employi in Emp
        join PhoneNumber in Phone on Employi.BusinessEntityID equals PhoneNumber.BusinessEntityID
        join BusEntity in BE on Employi.BusinessEntityID equals BusEntity.BusinessEntityID
        join Addy in Add on BusEntity.AddressID equals Addy.AddressID
        join StProv in State on Addy.StateProvinceID equals StProv.StateProvinceID
        where Employi.HireDate > userInputLimit
        select new {DateOfHire = Employi.HireDate, Address = Addy.AddressLine1 + Addy.City + StProv.StateProvinceCode + Addy.PostalCode,
                    Phone = PhoneNumber.PhoneNumber, Name = Employi.JobTitle};

現在,我將此對象傳遞給私有方法,以創建一個數據表,除了我將其作為匿名類型的IQueryable傳遞。 原因是,我的對象現在具有從多個類派生的屬性,而不再從單個員工類派生:-

private void createEmployeesDataTable(IQueryable Employees)
        {
.... how can I still access all of its properties and bind it to the datatable?? .... 
}

當我在IQueryable Employees對象上放置一個斷點時,我可以看到它具有正確存儲在其中的所有屬性名稱和值。 但是我似乎無法通過代碼訪問它們。

我班的一個例子:

 [Table(Name="HumanResources.Employee")]
    public class Employee
    {
        private int _BusinessEntityID;
        [Column(IsPrimaryKey = true, CanBeNull=false, Storage = "_BusinessEntityID")]
        public int BusinessEntityID
        {
            get
            {
                return this._BusinessEntityID;
            }
            set
            {
                this._BusinessEntityID = value;
            }

        }

        private string _JobTitle;
        [Column(Storage = "_JobTitle", CanBeNull=false, DbType="nvarchar(50) NOT NULL")]
        public string JobTitle
        {
            get
            {
                return this._JobTitle;
            }
            set
            {
                this._JobTitle = value;
            }
        }


        private DateTime _HireDate;
        [Column(Storage = "_HireDate", CanBeNull=false)]
        public DateTime HireDate
        {
            get
            {
                return this._HireDate;
            }
            set
            {
                this._HireDate = value;
            }
        }
    }

當我在IQueryable Employees對象上放置一個斷點時,我可以看到它具有正確存儲在其中的所有屬性名稱和值。 但是我似乎無法通過代碼訪問它們。

這是因為非通用的 IQueryable接口對基礎類型一無所知。 您必須使用通用版本( IQueryable<T> )在設計時查看項目的屬性。

但是,由於您要投影為匿名類型(盡管您將其命名為變量,但不是一個Employee對象的集合),所以在編譯時您不知道類型名稱,因此無法指定類型T用於IQueryable<T>

最好的解決方案是定義一個具體的類型,而不要使用anonymous on,以便您可以在編譯時訪問該字段。 可以使用dynamic ,但隨后會將屬性綁定延遲到運行時,並且在編譯時不會捕獲任何錯誤。

類的定義將類似於:

public class EmployeeView
{
    public DateTime DateOfHire {get; set;}
    public string AddressLine1 {get; set;}
    public string City {get; set;}
    public string StateProvinceCode {get; set;}
    public string PostalCode {get; set;}
    public string Phone {get; set;}
    public string Name {get; set;}
}

您的預測將是:

select new EmployeeView {
    DateOfHire = Employi.HireDate, 
    AddressLine1 = Addy.AddressLine1,
    City = Addy.City,
    StateProvinceCode = StProv.StateProvinceCode,
    PostalCode = Addy.PostalCode,
    Phone = PhoneNumber.PhoneNumber, 
    Name = Employi.JobTitle};

現在,您可以在中指定類型:

private void CreateEmployeesDataTable(IEnumerable<EmployeeView> employees)
{
    .... 
}

請注意,我已將大小寫更改為.NET標准-大寫駝峰式的類和小寫駝峰式的變量

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM