我在ASP.NET MVC项目中工作,我创建了两个LinqToSQL类。我还为模型创建了一个存储库类,我在该类中实现了一些方法,如LIST,ADD,SAVE,它为控制器提供数据。现在在一个存储库类中,我已经使用这样的LINQ连接提取了一些数据。
private HerculesCompanyDataContext Company = new HerculesCompanyDataContext();
private HerculesMainDataContext MasterData = new HerculesMainDataContext();
public IQueryable TRFLIST()
{
var info = from trfTable in Company.TRFs
join exusrTable in MasterData.ex_users on trfTable.P_ID equals exusrTable.EXUSER
select new
{
trfTable.REQ_NO,
trfTable.REQ_DATE,
exusrTable.USER_NAME,
exusrTable.USER_LNAME,
trfTable.FROM_DT,
trfTable.TO_DT,
trfTable.DESTN,
trfTable.TRAIN,
trfTable.CAR,
trfTable.AIRPLANE,
trfTable.TAXI,
trfTable.TPURPOSE,
trfTable.STAT,
trfTable.ROUTING
};
return info;
}
现在,当我从控制器调用此方法时,我无法获取列表。我想知道的是,如果不创建自定义数据模型类,我如何返回像IQueryable这样的匿名类型的对象。并且因为这不属于任何一个数据模型,所以如何在视图中引用此列表。
答案 0 :(得分:3)
您无法返回“匿名类型”的对象。请参阅解决这种情况的this previous post of mine,看来匿名类型会让我们在强类型上做一些作弊,但他们没有。
是的,从灵活类型(如DataTables)迁移到强类型对象是解决方案策略的重要组成部分。使用LINQ-To-SQL,您应该能够非常轻松地返回强类型实体对象。您的存储库方法需要返回特定类型的IQueryable接口,例如IQueryable<TRF>
,而不仅仅是IQueryable
。或者,存储库方法只能返回单个TRF
实体对象或这些对象的列表。
请注意,匿名类型和隐式类型变量是两个非常不同的东西。在后台由编译器为您创建匿名类型。在这种情况下,不要像在示例LINQ查询中那样将数据放入匿名类型。假设您的实体是trfTable,请尝试:
public IQueryable<trfTable> TRFLIST()
{
var info = from trfTable in Company.TRFs
join exusrTable in MasterData.ex_users on trfTable.P_ID equals exusrTable.EXUSER
select new trfTable
return info;
}
这样做的好处是它可以充分利用IQueryable的性质,因为在存储库外添加的标准实际上会添加到生成的查询中。这很酷。但是,there is some good debate关于这是否是最佳方式。
请注意,info
这里的隐式输入,但不是匿名类型。这是一个IQuerable<trfTable>
。这是关键的区别。
答案 1 :(得分:1)
您可以返回匿名类型,而不是强类型的方式。我使用此方法来创建json可序列化类型。
在数据模型类中返回一种“对象”:
public object TRFLIST()
{
var info = from trfTable in Company.TRFs
join exusrTable in MasterData.ex_users on trfTable.P_ID equals exusrTable.EXUSER
select new
{
trfTable.REQ_NO,
trfTable.REQ_DATE,
exusrTable.USER_NAME,
exusrTable.USER_LNAME,
trfTable.FROM_DT,
<snipped>
};
return info;
}
然后从你的控制器中调用它(在这个例子中,我用它来返回一个JsonResult):
public JsonResult() {
var myAnonTRFLIST = dataClassInstance.TRFLIST();
return Json(myAnonTRFLIST, JsonRequestBehavior.Allowget);
}
如果您在4.0 ...
-UPDATE:我刚尝试了这个,它完美无缺 -
在数据模型类中返回一种“对象”:
public List<object> TRFLIST()
{
var info = from trfTable in Company.TRFs
join exusrTable in MasterData.ex_users on trfTable.P_ID equals exusrTable.EXUSER
select new
{
trfTable.REQ_NO,
trfTable.REQ_DATE,
exusrTable.USER_NAME,
exusrTable.USER_LNAME,
trfTable.FROM_DT,
<snipped>
};
return info.ToList<object>();
}
public JsonResult() {
dynamic myAnonTRFLIST = dataClassInstance.TRFLIST();
string test = myAnonTRFLIST[0].USER_NAME;
<Do something with Test>
return Json(myAnonTRFLIST, JsonRequestBehavior.Allowget);
}