Использование linq для сущностей для замены значения идентификатора базы данных на текстовое значение в раскрывающемся списке - PullRequest
1 голос
/ 14 декабря 2011

У меня есть форма с информацией о пользователе. Одним из элементов формы является выпадающий список, содержащий список стран. Форма просмотра привязана к таблице базы данных, в которой хранится идентификатор страны, а не название страны. У меня есть внешний ключ, определенный между моей таблицей Users и моей таблицей стран. Это также отражено в моей модели данных объекта.

Учитывая, что среда знает о взаимосвязи между двумя таблицами, каков самый быстрый способ поменять идентификатор страны на название страны при отображении данных пользователя на веб-странице? В настоящее время я выполняю следующий код для достижения этой цели:

protected void CstCountryLabel_DataBinding(object sender, EventArgs e)
    {
        using (kdEntities db = new kdEntities())
        {
            Label lbl = sender as Label;

            int cntID = int.Parse(Eval("CstCntID").ToString());

            IQueryable<Country> countries = from Countries in db.Countries
                                                  where Countries.CntID == cntID
                                                  select Countries;

            var firstOrDefault = countries.FirstOrDefault();
            lbl.Text = firstOrDefault != null ? firstOrDefault.CntDescription : "";
        }
    }

Мне кажется, что, возможно, есть лучший способ, поскольку я определил отношения между двумя таблицами в диаграмме структуры сущностей.

1 Ответ

1 голос
/ 14 декабря 2011

Обычно я полностью ориентируюсь на модель при работе со своими сущностями.Не зная, как вы определяете свои отношения сущностей, я пойду с CodeFirst.

Классы

Пользователь

[Table("tblUsers")]
class User
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int CountryID { get; set; }

    [ForeignKey("CountryID")]
    public virtual Country Country { get; set; }
}

Страна

[Table("tblCountries")]
public class Country
{
    public int ID { get; set; }
    public string Name { get; set; }

    public static Country Find(MyContext db, int id)
    {
        return db.Countries.Find(id);
    }

    public static Country Find(MyContext db, string CountryName)
    {
        var matches = from c in db.Countries where c.Name == CountryName select c;
        if (matches.Count() > 0)
        {
            return matches.First();
        }
        else
        {
            return null;
        }
    }
}

Контекст

class MyContext : DbContext
{
    public MyContext () : base()
    {

    }

    public DbSet<User> Users { get; set; }
    public DbSet<Country> Countries { get; set; }
}

Беспорядок с этими данными

    public void Main()
    {
        MyContext db = new MyContext();
        Country Canada = Country.Find(db, "Canada");
        var users = from u in db.Users select u;
        foreach (User u in users)
        {
            u.Country = Canada;

        }
        db.SaveChanges();
    }

Таким образом, Entity Framework может выполнять работу по настройке эталонных значений, все, о чем вам нужно беспокоиться - это работать с конкретными объектами.

Опять же, я не знаю, какую форму принимают ваши сущности, но Entity Framework работает в основном равномерно между своими воплощениями.

Отображение раскрывающегося списка должно быть довольно простым.Недавно я делал нечто подобное в приложении MVC со списком (я пишу об объектах Country, но в моем примере я работаю с оператором телефонной связи).Я создал класс ViewModel, который будет содержать мою запись пользователя, а также список SelectList, который содержит список всех стран, TextValue (countryName) и DataValue (CountryID) и функцию, чтобы определить, должен ли быть выбран какой-либо конкретный элемент насписок.Это выглядит примерно так:

ViewModel

public class UserProfileViewModel
{
    public UserProfileViewModel() 
    {
        AllCarriers = new AspAppServicesContext().Carriers.ToList();
        selCarrier = new SelectList(AllCarriers, "ID", "Name", null);
    }

    public UserProfileViewModel(RegisterModel profile)
    {
        this.MyProfile = profile;
        AllCarriers = new AspAppServicesContext().Carriers.ToList();
        selCarrier = new SelectList(AllCarriers, "ID", "Name", this.MyProfile.CarrierID);
    }

    public RegisterModel MyProfile { get; set; }
    public List<Carrier> AllCarriers { get; set; }
    public SelectList selCarrier { get; set; }
    public object SelectedCarrier { get; set; }
}

Пример ListBox

        <div class="editor-label">
            @Html.LabelFor(m => m.CarrierID)
        </div>
        <div class="editor-field">
            @Html.ListBox("SelectedCarrier", Model.selCarrier)
        </div>

В этом примере на выходной странице будет список со списком, имя которого - SelectedCarrier, икаждый элемент в списке будет выглядеть примерно так:

<option value="1">Canada Telecom</option>

Значение - это идентификатор, а Canada Telecom - это имя оператора, которое отображается в списке.При отправке массив строк возвращается свойству SelectedCarrier (имя списка) в ViewModel, чтобы выполнить то, что вы хотите.В моем случае я использовал следующее на своем контроллере, чтобы внести изменения в профиль пользователя:

if (model.SelectedCarrier != null)
{
    string[] SelectedCarrier = (string[])model.SelectedCarrier;
    profile.CarrierID = int.Parse(SelectedCarrier[0]);
}
profile.Save();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...