Linq to SQL MVC проблема с FK - PullRequest
0 голосов
/ 22 июня 2009

Правильно, что у меня немного сложный умственный блог с некоторыми Linq to SQL и MVC.

Начало работы с MVC и L2SQL в порядке.

  1. ФК отношения. -> при использовании MVC и у нас есть отношения fk в модели, и представление основано на строго типизированном объекте - как вы получаете данные из связанной таблицы?

Например,

User (Table)
UserId
UserName

Call (Table)
    CallId
    UserId
    CountryId

Country(Table)
CountryID
CountryName

ТАК, я хочу получать только звонки для пользователя с определенной страной?

Представление - основано на Call Object, так как это представление "Details" -

как мне получить UserName и CountryName и при этом поддерживать представление на основе Call?

Казалось бы, мне все еще нужно создать объект CallForUserByCountry - но это становится грязным при сохранении в качестве объекта CallForUserByCountry также необходимо реализовать способ создания Call User и Country.

запрос 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 ]

2 голосов
/ 23 июня 2009

Если у класса данных Call есть ассоциации с классами данных User и Call, вы можете получить доступ к свойствам User и Country Call непосредственно в вашем View. Также вы можете сразу загрузить данные из связанных таблиц пользователя и страны (вместо отложенной загрузки по умолчанию):

В контроллере:

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 %>
0 голосов
/ 23 июня 2009

Ваш вопрос можно ответить двумя способами.

  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); %>

<%}
0 голосов
/ 23 июня 2009

Если я правильно понимаю, вы пытаетесь получать звонки от конкретного пользователя с определенной страной. Если это так, то, пока у вас есть отношения, сопоставленные в конструкторе 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;
0 голосов
/ 23 июня 2009

Вы можете использовать сумку TempData и сохранить там имя пользователя и страну.

в контроллере: TempData ["CountryName"] = countryName;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...