Linq to Sql - 从1:多选

时间:2009-02-19 17:40:35

标签: c# asp.net linq-to-sql

我是使用Linq的新手,刚刚开始了一个侧面项目来学习一些基础知识。我目前正在使用Linq到Sql,我所有的DB Table关系都运行得很好。目前我有一个Client表和一个Project表。每个客户可以有一个或多个项目。因此,正如您所期望的那样,在Linq发挥其魔力之后,每个Client对象都有一个Project对象的集合。

我正在使用下面的代码并且效果很好,但我认为有更好的方法。我需要传递我的方法一个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 个答案:

答案 0 :(得分:2)

获取具有特定项目ID的客户端:

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 :(得分:1)

尝试这样的事情:

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

答案 2 :(得分:1)

您可以使用以下内容替换foreach查找:

var project = client.Projects.Where(p=>p.id==projectID).SingleOrDefault();
if (project != null) statusProjectName.Text = project.name;