我试图只返回从linq到sql查询的几列,但如果我这样做,它会抛出异常:
不允许在查询中明确构造实体类型“InVision.Data.Employee”
以下是代码:
return db.Employees.Select(e => new Employee()
{ EmployeeID = e.EmployeeID, FirstName = e.FirstName,
LastName = e.LastName }).ToList();
如果我返回所有内容,那么它将抛出有关循环引用的异常,因为它需要被序列化以在javascript中使用,所以我真的需要限制列...感谢您提供的任何提示,我可以解决这个问题。
答案 0 :(得分:3)
因为在推荐使用View对象来处理这种情况而不是Linq2Sql实体之前,我必须与Linq2Sql和Serialization作斗争。它是一个更容易的解决方案:
return db.Employees
.Select( e => new EmployeeView()
{
EmployeeID = e.EmployeeID,
FirstName = e.FirstName,
LastName = e.LastName
}).ToList();
另一种方法是将Employee表的新副本拖到DBML设计器中,将其命名为SimpleEmployee,删除所有关系并删除不需要的所有列。
答案 1 :(得分:1)
基本上,如果您只想要列,请选择它们。如果您需要员工实体,请选择它。这里没有多少中间立场。我建议不要为此创建一个新类。呸!
这样做:
return db.Employees
.Select(e => new { e.EmployeeID, e.FirstName, e.LastName })
.ToList();
答案 2 :(得分:0)
贾斯汀,
您可以做的一件事是创建一个从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();
希望这有帮助。