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

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

以下是代码:

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

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

有帮助吗?

解决方案

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

这样做:

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

其他提示

因为在推荐使用View对象来处理这种情况而不是Linq2Sql实体之前,我必须与Linq2Sql和Serialization作斗争。它是一个更容易的解决方案:

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

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

贾斯汀,

此处的错误说明: 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();

希望这有帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top