Linq与FK的SQL MVC问题

时间:2009-06-22 19:38:13

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

正确地使用了一些基于Linq to SQL和MVC的精神博客。

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

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

    User (Table)
    UserId
    UserName
    

    Call (Table)
        CallId
        UserId
        CountryId
    

    Country(Table)
    CountryID
    CountryName
    

    所以我想只获得具有特定国家/地区的用户的电话?

    视图 - 基于Call Object,因为这是“详细信息”视图 -

    如何获取UserName和CountryName并仍然维护基于Call的视图?

    似乎我仍然需要创建一个Object 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.
    

    希望我错过了一些东西......

4 个答案:

答案 0 :(得分:2)

如果Call数据类与User和Call数据类有关联,您可以直接在View中访问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 %>

答案 1 :(得分:0)

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

控制器中的

: TempData [“CountryName”] = countryName;

答案 2 :(得分:0)

如果我正确理解了这一点,那么您正试图接收来自特定国家/地区的特定用户的电话。如果是这种情况,那么只要您在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;

答案 3 :(得分:0)

您的问题可以采取两种方式。

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

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

  3. 对于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); %>
    
    <%}