我有以下两个表(基本概要):
Tbl_CategoryType
ID LevelID 描述
Tbl_Levels ID 名称
基本上,我想在Tbl_CategoryType表中提供所有信息,同时根据Tbl_CategoryType.LevelID编号引用Tbl_Levels.Name数据。
我尝试在我的存储库中使用连接,如下所示;
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});
}
但是,当我调用该方法时,没有类型我可以将其分配给它,因为它不适合类别或级别的类型。
我假设我需要通过自定义视图模型执行此操作,但无法弄清楚步骤。
提前致谢
答案 0 :(得分:4)
在你的linq语句中使用这一行:
select new {x, y}
您正在创建新的匿名类型,这是与您的实体类型不同的类型。
我猜你没有使用EntityFramework或其他一些会自动解析外键关系以创建链接实体的重型框架。如果为true,那么是的,您将需要创建一个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。
答案 1 :(得分: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