5

我有以下两个表(基本大纲):

Tbl_CategoryType

ID 级别ID 说明

Tbl_Levels ID 名称

基本上,我想在基于 Tbl_CategoryType.LevelID 编号引用 Tbl_Levels.Name 数据的同时呈现 Tbl_CategoryType 表中的所有信息。

我尝试在我的存储库中使用加入,如下所示;

public IQueryable GetAllTypesInCategory(int CatID)
{
     return (from x in DBEntities.LU_LST_CategoryTypeSet
             where x.CategoryID == CatID && x.Enabled == 1
             join y in DBEntities.LU_LST_LevelSet on x.LevelID equals y.ID
             select new {x, y});
}

但是,当我调用该方法时,我无法将其分配给任何类型,因为它不适合 Category 或 Level 的类型。

我假设我需要通过自定义视图模型来执行此操作,但无法弄清楚步骤。

提前致谢

4

2 回答 2

4

通过在您的 linq 语句中使用这一行:

select new {x, y}

您正在创建一个新的匿名类型,它与您的实体类型不同。

我猜你没有使用 EntityFramework 或其他一些会自动解析外键关系以创建链接实体的重型框架。如果为真,那么是的,您将需要创建一个 ViewModel。

只需创建一个简单的包装类,其中包含每个实体之一作为属性。

public class MyViewModel
{
    public MyViewModel(LU_LST_CategoryTypeSet x, LU_LST_LevelSet y)
    {
        Category = x;
        Level = y;
    }

    public LU_LST_CategoryTypeSet Category { get; set;}
    public LU_LST_LevelSet Level { get; set; }
}

然后在您的 Linq 语句中,创建 MyViewModel 类型,而不是创建匿名类型:

public IQueryable GetAllTypesInCategory(int CatID)
{
     return (from x in DBEntities.LU_LST_CategoryTypeSet
             where x.CategoryID == CatID && x.Enabled == 1
             join y in DBEntities.LU_LST_LevelSet on x.LevelID equals y.ID
             select new {x, y});
}

然后将结果复制到您的模型类中:

   var listOfTypes = GetAllTypesInCategory(catID);
   foreach (var item in listOfTypes)
   {
      var model = new MyViewModel(item.x, item.y);

      //Do whatever with the model to get it to the view.
   }

让您的视图继承自 MyViewModel。

于 2010-01-06T07:49:35.847 回答
3

如果两个实体之间存在关联,您可以使用它访问第二种类型。在这种情况下,您唯一需要做的就是使用 Include() 方法来加载关联数据。

       public List<LU_LST_CategoryType> GetAllTypesInCategory(int CatID)  
         { 
             return (from x in DBEntities.LU_LST_CategoryTypeSet.Include("LU_LST_LevelSet") 
                     where x.CategoryID == CatID && x.Enabled == 1  
                     select x).ToList(); 
         }

LU_LST_CategoryTypeSet category你可以打电话的每一个category.LU_LST_Level

于 2010-01-06T08:02:20.140 回答