2

我试图只从 linq 到 sql 查询返回几列,但如果我这样做,它会引发异常:

不允许在查询中显式构造实体类型“InVision.Data.Employee”

这是代码:

return db.Employees.Select(e => new Employee()
       { EmployeeID = e.EmployeeID, FirstName = e.FirstName,
         LastName = e.LastName }).ToList();

如果我返回所有内容,那么它将引发有关循环引用的异常,因为它需要被序列化才能在 javascript 中使用,所以我真的需要限制列...感谢您可以给我解决这个问题的任何提示。

4

3 回答 3

3

因为在我推荐使用 View 对象而不是 Linq2Sql 实体来处理这种情况之前,我不得不与 Linq2Sql 和序列化作斗争。它是一个更简单的解决方案:

return db.Employees
        .Select( e => new EmployeeView() 
        { 
            EmployeeID = e.EmployeeID, 
            FirstName = e.FirstName, 
            LastName = e.LastName 
         }).ToList();

另一种选择是将 Employee 表的新副本拖到 DBML 设计器中,将其命名为 SimpleEmployee 之类的不同名称,删除所有关系并删除所有不需要的列。

于 2009-06-19T01:26:34.637 回答
2

基本上,如果您只想要列,请选择那些。如果您想要员工实体,请选择它。这里没有太多的中间立场。我建议不要为此创建一个新课程。呸!

做这个:

return db.Employees
   .Select(e => new { e.EmployeeID, e.FirstName, e.LastName })
   .ToList();
于 2009-06-19T01:30:33.430 回答
0

贾斯汀,

此处对该错误的解释:http: //devlicio.us/blogs/derik_whittaker/archive/2008/04/25/linq2sql-explicit-construction-of-entity-exception.aspx

您可以做的一件事是创建一个派生自 Employee 的类。

public class EmployeeProxy : Employee
{
}

然后你可以做你的查询:

return db.Employees.Select(e => new EmployeeProxy { EmployeeID=e.EmployeeID, FirstName=e.FirstName, LastName=e.LastName }).ToList();

另一方面,如果您只需要将结果集序列化为javascript,那么您也可以只使用匿名类。这也有效:

return db.Employees.Select(e => new { EmployeeID=e.EmployeeID, FirstName=e.FirstName, LastName=e.LastName }).ToList();

希望这可以帮助。

于 2009-06-19T01:26:14.217 回答