解决 ”不允许在查询中显式构造实体类型“问题及使用其他方法实现返回 List<Model对象>或者IQueryable<Model对象>对象
2012-04-29 17:28
1696 查看
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 ; }
} 这样就不会在报 “不允许在查询中显式构造实体类型” 错误了.
[b]方法2:[/b] 使用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>();}
相关文章推荐
- Java中使用hql,sql查询返回的list<Object> 转成需要的实体对象--方法讲解!
- 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为
- jquery 中$.post获取MVC Controller中JsonResult返回包含LIst<Model>类型的子List<Model>的高级使用方法
- IEnumber<Model.Category> 实现接口对象没有Add()方法解决问题
- jquery 中$.post获取MVC Controller中JsonResult返回包含LIst<Model>类型的子List<Model>的高级使用方法
- 1.解决“不允许在查询中显式构造实体类型” 问题
- EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真
- mybatis返回类型string,或者对象,均可用list<string>或者,list<对象>来接收
- Linq to SQL中报错"不允许在查询中显式构造实体类型"怎么解决
- 错误:因为相同类型的其他实体已具有相同的主键值。在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 解决方法
- 关于List<Model>类型 GridView排序问题的解决
- hibernate使用本地sql语句查询,解决List<Object[]>转换成List<实体>
- RestTemplate解决返回类型为Object<List<T>>问题
- 使用Map把sql返回的list<Object>转成需要的实体对象
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- Linq to SQL中报错"不允许在查询中显式构造实体类型"怎么解决
- 利用反射实现mysql数据库sql查询 返回List<E>泛型(持久化)对象
- 解决linq中不允许在查询中显式构造实体类型
- Jeecg中使用<t: dgCol>标签的自动构造查询条件时出现类型转换错误的解决办法。
- 17开年第一篇Activity之间传递List<T> 以及T对象类型数据的方法