MVC LINQ查询使用一对多和多对一表填充模型

时间:2012-11-15 21:42:21

标签: linq asp.net-mvc-4 entity-framework-5

考虑到域表结构,我试图让我的模型填充。

我有一个存储供应商的主表,每个供应商可以从主类别查找表中选择一对多类别。供应商选择存储在另一个表中,该表仅存储VendorID和CategoryID以在它们之间进行链接。

我可以编写查询(下面)以包含类别表,但之后我只能显示categoryID而不是类别名称。

        public VendorProfile GetVendor(String id)
    {
        Guid pid = Guid.Parse(id);
        var view = _db.VendorProfiles.Include("VendorCategories").Single(v => v.ProfileID == pid);
        return view;
    }

我试图在查询中包含查找表(如下所示),但这会产生运行时错误。

        public VendorProfile GetVendor(String id)
    {
        Guid pid = Guid.Parse(id);
        var view = _db.VendorProfiles.Include("VendorCategories").Include("ProductServiceCategory").Single(v => v.ProfileID == pid);
        return view;
    }

指定的包含路径无效。 EntityType的“VendorProfilesIntranet.VendorProfile”未声明名为“ProductServiceCategory”的导航属性。

“类别”表具有导航属性。我不知道如何将相同的导航属性添加到主表,因为它没有任何FK到查找表。

更新:

@Gert这种符号确实有效!

_db.VendorProfiles.Include("VendorCategories.ProductServiceCategory").Single(v => v.ProfileID == pid);

但是,我现在显示的只是所选的类别项目。我希望获得整个catgories列表,并检查已选中的那些。我正在使用滚动的CheckboxList。

       <div class="scroll_checkboxes">
        <ul>
        @foreach (var c in Model.VendorCategories)
        {
           <li>
               <input type="checkbox" name="categories" value="@c.ID" /> @c.ProductServiceCategory.CategoryName
           </li>
        }
        </ul>
        @Html.ValidationMessage("Please check at least one Product/Service category")
    </div>

UPDATE2:

可能有一个更好的解决方案,但对于遇到类似情况的人来说,这是有效的

        <div class="scroll_checkboxes">
        <ul>
        @foreach (var c in ViewBag.Categories)
        {
           <li>
               @foreach(var vc in Model.VendorCategories)
               {
                   if(c.Id == vc.CategoryID)
                   {
                        <input type="checkbox" name="categories" checked="checked" value="@c.Id" /> @vc.ProductServiceCategory.CategoryName
                       <br />
                   }
                   else
                   {
                        <input type="checkbox" name="categories" value="@c.Id" /> @vc.ProductServiceCategory.CategoryName
                        <br />
                   }
               }
           </li>
        }
        </ul>
        @Html.ValidationMessage("Please check at least one Product/Service category")
    </div>

1 个答案:

答案 0 :(得分:1)

你可以做到

_db.VendorProfiles.Include("VendorCategories.ProductServiceCategory")

在结果集中包含VendorCategories及其ProductServiceCategory

顺便说一下,如果你使用DbExtensions.Include,你就会有智能感知来帮助你找到合适的包含路径。