【问题标题】:Linq to SQL MVC issue with FKFK 的 Linq to SQL MVC 问题
【发布时间】:2009-06-23 12:29:06
【问题描述】:

正确的有一些关于 Linq to SQL 和 MVC 的硬脑力博客。

让基本的 MVC 和 L2SQL 正常运行。

  1. FK 关系。 -> 当使用 MVC 并且我们在模型中有一个 fk 关系时, 并且视图基于强类型对象 - 如何从相关表中获取数据?

例如

User (Table)
UserId
UserName

Call (Table)
    CallId
    UserId
    CountryId

Country(Table)
CountryID
CountryName

所以我只想接听特定国家/地区用户的电话?

视图 - 基于调用对象,因为这是“详细信息”视图 -

我如何获得 UserName 和 CountryName 并仍然保持基于 Call 的视图?

看来我仍然需要创建一个对象 CallForUserByCountry - 但这会变得一团糟 在保存为 CallForUserByCountry 对象时还需要实现如何创建呼叫用户和国家。

linq 查询

var calls = from c in db.Call
    where c.CountryID == id

        select new CallForUserByCountry or new something// this is bit that suggests a new object.

希望我错过了什么......

【问题讨论】:

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


    【解决方案1】:

    如果 Call 数据类与 User 和 Call 数据类有关联,您可以直接在视图中访问 Call 的 User 和 Country 属性。您还可以立即从相关的 User 和 Country 表中加载数据(而不是默认延迟加载):

    在控制器中:

    DataLoadOptions options = new DataLoadOptions();
    options.LoadWith<Call>(x => x.User);
    options.LoadWith<Call>(x => x.Country);
    db.LoadOptions = options;
    
    var calls = from c in db.Call
        where c.Country.CountryName == countryName && c.User.UserName == userName
            select c;
    

    在视图中:

    <%= Model.User.UserName %>
    <%= Model.Country.CountryName %>
    

    【讨论】:

      【解决方案2】:

      您可以使用 TempData 包并将用户名和国家/地区名称保存在那里。

      在控制器中: TempData["CountryName"] = countryName;

      【讨论】:

        【解决方案3】:

        如果我的理解正确,您是在尝试接听来自特定国家/地区的特定用户的电话。如果是这种情况,那么只要您在 Linq2SQL 设计器中映射了关系,那么您应该能够从调用中访问用户和国家/地区作为属性。所以它会是这样的:

        var userName = call.User.UserName;
        

        正如我所说,这取决于设计器中映射的关系,否则 Linq2SQL 将无法指示这两个表是相关的。

        您还可以有一个单独的查询,以根据用户和国家/地区获取您需要的电话:

        var calls = from c in db.Call
                    where c.User.UserID = userID
                    && c.Country.CountryID == countryID
                    select c;
        

        【讨论】:

        • 这种方法违背了 MVC 原则,因为您会从视图中触发数据库查询。控制器应该获取视图需要的所有数据。这样,您的应用更易于测试,并且您可以保持清晰的关注点分离
        • 我并不是建议您在视图中执行此操作,我只是在修改他的查询(我假设不在视图中,但不能确定)。理论上,这将在存储库中的某个地方作为一个函数完成,该函数与仅检索所有调用的函数分开。
        【解决方案4】:

        您的问题可以有两种方式。

        1. 您希望使用当前呼叫详细信息视图显示呼叫列表。 - 这需要一个新的观点。除非详细信息视图是 ViewUserControl。然后你可以使用 PartialRender。

        2. 您想要将额外数据添加到当前详细信息视图 - 将额外数据添加到 ViewData。

        对于 2 号,您可以执行以下操作。

        我更喜欢为此使用连接,并且我喜欢处理与我的 DataContext 分离的对象。所以通常我的对象中没有额外的 IQueryable。

        我仍然会使用 CallForUserByCountry 对象。让事情变得冗长。

        var calls = from call in db.Calls
                    join country in db.Countries on call.CountryId equals country.CountryID
                    join user in db.Users on call.UserId equals user.UserId
                    where user.UserName == userName && country.CountryName == countryName
                    select new CallForUserByCountry
                    {
                       UserName = user.UserName,
                       CountryName = country.CountryName,
                       Call = call
                    };
        
        View["CallsForUserByCountry"] = calls.ToList();
        
        In the view.
        
        <% foreach(var callForUserByCountry in (IList<CallForUserByCountry>)ViewData["CallsForUserByCountry"]) { %>
          .. Do stuff here .. I like using PartialRendering 
          <% Html.PartialRender("CallForUserByCountryDetail", callForUserByCountry); %>
        
        <%}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多