Linq to Sql - выбор из 1: много - PullRequest
       27

Linq to Sql - выбор из 1: много

0 голосов
/ 19 февраля 2009

Я новичок в использовании Linq и только начал сторонний проект, чтобы изучить некоторые основы. В настоящее время я использую Linq to Sql, и все мои отношения с таблицей БД работали очень хорошо. В настоящее время у меня есть таблица клиента и таблица проекта. Каждый клиент может иметь 1 или более проектов. Поэтому, как и следовало ожидать, каждый объект Client имеет коллекцию объектов Project после того, как Linq сделает свое дело.

Я использую приведенный ниже код, и он хорошо работает, но я думаю, что есть лучший способ сделать это. Мне нужно передать моему методу ProjectID, а затем выбрать этот проект на клиенте:

    private void PopulateStatusView(int projectID)
    {
        MyDataContext db = new MyDataContext();

        var client = (from u in db.Clients
                      where u.id == Convert.ToInt32(Session["ClientID"])
                      select u).SingleOrDefault();

        if (client != null)
        {
            foreach (Project currentProject in client.Projects)
            {
                if (currentProject.id == projectID)
                {
                    // Project Selected Here
                    statusProjectName.Text = currentProject.name;
                }
            }
        }
        else
        {
             // Session Expired
        }
    }

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

Спасибо.

Ответы [ 3 ]

2 голосов
/ 19 февраля 2009

Получить клиента, у которого есть конкретный идентификатор проекта:

var client = (from u in db.Clients
              where u.id == Convert.ToInt32(Session["ClientID"]) && 
                    u.Projects.Any(x=>x.id == projectID)
              select u).SingleOrDefault();

Чтобы получить проект:

var project = (from u in db.Clients
              where u.id == Convert.ToInt32(Session["ClientID"]) && 
                    u.Projects.Any(x=>x.id == projectID)
              select u.Projects.Where(x=>x.id == projectID).Single()).SingleOrDefault();
1 голос
/ 19 февраля 2009

Вы можете заменить foreach на что-то вроде:

var project = client.Projects.Where(p=>p.id==projectID).SingleOrDefault();
if (project != null) statusProjectName.Text = project.name;
1 голос
/ 19 февраля 2009

Попробуйте что-то вроде этого:

clients.Projects.Where(
    p => p.id == projectID 
    && p.name == statusProjectName.Text);
...