如何使用LINQ创建IQueryable类型的匿名对象

时间:2010-05-27 14:06:47

标签: .net asp.net-mvc linq-to-sql repository

我在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这样的匿名类型的对象。并且因为这不属于任何一个数据模型,所以如何在视图中引用此列表。

2 个答案:

答案 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);
}