您的位置:首页 > 产品设计 > UI/UE

解决 ”不允许在查询中显式构造实体类型“问题及使用其他方法实现返回 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>();}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐