2010-05-27 84 views
4

我正在创建两个LinqToSQL类的ASP.NET MVC项目中工作。我还为这些模型创建了一个存储库类,并且我已经在该类中实现了一些方法,如LIST,ADD,SAVE,它们为控制器提供数据。现在在其中一个存储库类中,我使用LINQ连接添加了一些数据。如何使用LINQ创建IQueryable类型的匿名对象

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

回答

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>。这是关键的区别。

+0

所以对于每一个复杂的查询我写我做必须从那里写一个自定义的类? – 2010-05-27 14:11:10

+0

否。起点是每个实体的不同存储库类别。你可能有1个“select”方法,你可能有8个。理想情况下,你的“select”方法至少需要一些参数来确保查询至少部分基于索引字段。有关平衡多少种方法的讨论,请参阅:http://stackoverflow.com/questions/2849873/2849944#2849944 – 2010-05-27 14:58:17

1

您可以排序返回一个匿名类型,但不是强类型的方式。我使用这种方法来创建json-serializable类型。

返回一个类型的数据模型类“对象”的:

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:我只是尝试了这一点,它的工作perfectly-

返回你的数据模型类的类型“对象”的:

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