• 解决 ”不允许在查询中显式构造实体类型“问题及使用其他方法实现返回 List<Model对象>或者IQueryable<Model对象>对象


    1.解决“NotSupportedException:“Explicit construction of entity type 'xx object' in query is not allowed.即:“不允许在查询中显式构造实体类型” 问题及 
    使用其他方法实现返回List<Model对象>或者IQueryable<Model对象>对象。
    方法1
    例子1:
          实体类UsersInfo
         [Table(Name = "Users")]
    public class UsersInfo
    {
    [Column(Name="UserID", IsPrimaryKey = true, CanBeNull=false, IsDbGenerated=false, AutoSync=AutoSync.OnInsert)]
    public System.String UserID { get ; set ; }
    		[Column(Name="CompanyName",CanBeNull=false)]
    public System.String CompanyName { get ; set ; }
        }
    public IQueryable<UsersInfo> GetItemsForListing(int ownerId)
    {
        ItemDataContext dataContext = new ItemDataContext();
        var query = from item in dataContext.Users
                    where item.UserID == ownerId
                    orderby item.UserID descending
                    select new UsersInfo
                    {
                        UserID = item.UserID,
                        CompanyName= item.CompanyName,
                    };
        return query;
    }
    使用上面的代码将报 “不允许在查询中显式构造实体类型” 错误,怎么解决此问题呢?
    修改UsersInfo实体类
          实体类UsersInfo
    	public class UsersInfo
    {
    public System.String UserID { get ; set ; }
    		public System.String CompanyName { get ; set ; }
        }
    这样就不会在报 “不允许在查询中显式构造实体类型” 错误了.

    方法2:
    使用DataContext对象的Translate方法
    例子2:
    public List<EmloyeesInfo> GetEmloyeesInfoForListing()
    {
          List<EmployeesInfo> emp_list=null;
           ItemDataContext dataContext = new ItemDataContext();
           datacontext.Connection.Open();
    SqlConnection con = (SqlConnection)datacontext.Connection;
    string sql = @"SELECT EmployeeID,[FirstName] ,[LastName] FROM [Employees] ";
    SqlCommand com = new SqlCommand(sql, con);
    using (DbDataReader reader = com.ExecuteReader(CommandBehavior.CloseConnection))
    {
    //在ExecuteReader之后即使用Translate方法将DbDataReader里的数据转换成EmployeesInfo对象
    //Translate方法从DbDataReader中生成对象的规则和内置的DataContext.ExecuteQuery方法一样
    return emp_list = datacontext.Translate<EmployeesInfo>(reader).ToList();
    }
           //注意:DataContext对象如果显示的将Connection打开的话,
    //即使调用了DataContext对象的Dispose方法也不会自动关闭,
    //所以在这里使用Using(),在关闭DbDataReader的时候将Connection也一起关闭了
    }
    对上面方法扩展如下:
         public static List<T> ExecuteQuery<T>(this DataContext context, IQueryable query) 
    {
    DbCommand com = context.GetCommand(query);
    context.OpenConnection();
    using(DbDataReader reader=com.ExecuteReader())
    {
    return context.Translate<T>(reader).ToList();
    }
    }
            public static void OpenConnection(this DataContext context)
    {
    if (context.Connection.State == ConnectionState.Closed) context.Connection.Open();
    }


    方法3:
    使用DataContext对象的ExecuteQuery方法

    例子3:

    public IQueryable<EmloyeesInfo> GetEmloyeesInfoForListing(int id)
    {

          ItemDataContext dataContext = new ItemDataContext();

          string sql = "SELECT EmployeeID,[FirstName] ,[LastName] FROM [Employees] where EmloyeeID={0}";
          return datacontext.ExecuteQuery<EmployeesInfo>(sql,id).AsQueryable<EmloyeesInfo>();

    }

     


  • 相关阅读:
    AutoMapperHelper
    EmitMapper的使用
    hdu5396 Expression 区间dp +排列组合
    Eclipse 4.2 安装Java反编译插件
    hdu 1728 逃离迷宫 bfs记步数
    阿里云部署Docker(2)
    程序猿面试宝典(第四版)——读书笔记-1、第五章:程序设计基本概念
    IOS
    hdu 5078 2014鞍山现场赛 水题
    资源文件
  • 原文地址:https://www.cnblogs.com/wang726zq/p/2476276.html
Copyright © 2020-2023  润新知