Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq到Sql-从1:Many中选择_C#_Asp.net_Linq To Sql - Fatal编程技术网

C# Linq到Sql-从1:Many中选择

C# Linq到Sql-从1:Many中选择,c#,asp.net,linq-to-sql,C#,Asp.net,Linq To Sql,我刚开始使用Linq,刚刚开始了一个辅助项目来学习一些基础知识。我目前正在使用LINQtoSQL,我所有的DB表关系都工作得很好。目前我有一个客户表和一个项目表。每个客户机可以有一个或多个项目。因此,正如您所期望的,在Linq发挥其魔力之后,每个客户机对象都有一个项目对象集合 我正在使用下面的代码,它工作得很好,但我认为有更好的方法。我需要向我的方法传递一个ProjectID,然后从客户端选择该项目: private void PopulateStatusView(int project

我刚开始使用Linq,刚刚开始了一个辅助项目来学习一些基础知识。我目前正在使用LINQtoSQL,我所有的DB表关系都工作得很好。目前我有一个客户表和一个项目表。每个客户机可以有一个或多个项目。因此,正如您所期望的,在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
        }
    }
有人能告诉我是否有更好的解决方案,而不是在每个项目上循环吗


谢谢。

要获取具有特定项目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();

要获取具有特定项目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();

试着这样做:

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

试着这样做:

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

您可以将foreach查找替换为以下内容:

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

您可以将foreach查找替换为以下内容:

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

谢谢,我应该注意到我正在将statusProjectName的文本设置为项目名称,但您的方法仍然解决了问题。谢谢,我应该注意到我正在将statusProjectName的文本设置为项目名称,但您的方法仍然解决了问题。谢谢,这是最简洁的方法。使用Projects.Any和Projects.Where之间有很大区别吗?在这种情况下,Any返回一个布尔值来指示是否存在这样的项目ID。Where返回满足该ID的项目。“Any(x)”在语义上类似于“Where(x).Count()>0”。谢谢,这是最简洁的。使用Projects.Any和Projects.Where之间有很大区别吗?在这种情况下,Any返回一个布尔值来指示是否存在这样的项目ID。其中返回满足该ID的项目。“Any(x)”在语义上类似于“Where(x).Count()>0”