Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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语句分配多个变量_C#_Asp.net_Entity Framework_Linq - Fatal编程技术网

C# 如何从LINQ语句分配多个变量

C# 如何从LINQ语句分配多个变量,c#,asp.net,entity-framework,linq,C#,Asp.net,Entity Framework,Linq,假设我有一个C#object变量emp,它从不同的来源填充。因此,在某一点上,我有一个emp.PersonID,但没有名字/姓氏。现在,从存储器中获取数据的最简单方法是 emp.PersonLastName = from p in _context.Person where p.PersonID == emp.PersonID select p.LastName; emp.PersonFirstName = from p in _context.Person where

假设我有一个C#object变量
emp
,它从不同的来源填充。因此,在某一点上,我有一个
emp.PersonID
,但没有名字/姓氏。现在,从存储器中获取数据的最简单方法是

emp.PersonLastName = from p in _context.Person
   where  p.PersonID == emp.PersonID 
   select p.LastName;
emp.PersonFirstName = from p in _context.Person
   where  p.PersonID == emp.PersonID 
   select p.FirstName;
        ...
等等,我有大约5-10个变量,我需要这样做。显然,每个语句都会导致对单个列的数据库调用,而且通常看起来很愚蠢。但我想不出一种方法可以一次性分配多个成员变量。差不多

using (emp) {
   from p in _context.Person
   where  p.PersonID == emp.PersonID
   select new {
      PersonLastName = p.LastName,
      PersonFirstName = p.FirstName
               ...
   }
}

(显然,这只是一段伪代码,解释了我要完成的任务)

尝试下面的代码。不要使用匿名的新{…},而要使用新的emp(){…}


如果不更好地了解您的类型,您可以这样做:

var result=_context.Person
  .First(p=>p.PersonID==emp.PersonID);
emp.FirstName=result.FirstName;
emp.LastName=result.LastName;
这将只导致一个数据库调用。如果emp为person类型,则您可以这样替换它:

emp=_context.Person
  .First(p=>p.PersonID==emp.PersonID);

您可以将一体式查询的结果存储在临时变量中:

var matchingPerson = (
    from p in _context.Person
    where  p.PersonID == emp.PersonID 
    select p
).First();

emp.PersonLastName = p.LastName;
emp.PersonFirstName = p.FirstName;
如果你想一次完成所有任务,你不能;但是,如果您不介意employee对象是一个全新的对象,则可以一次性创建它

// Assume Employee class

var employee = (
    from p in _context.Person
    where  p.PersonID == emp.PersonID 
    select new Employee { 
        emp.PersonID, 
        PersonFirstName = p.FirstName,
        PersonLastName = p.LastName
    }
).First();

您的伪代码(除了使用(emp))之外)有什么问题?不清楚您在问什么。正如前面的注释所指出的,伪代码非常接近于正常的LINQ表达式,该表达式将返回匿名元素的枚举(甚至是可查询的),其中各个字段根据需要分配。你试过什么?有什么特别不适合你?请提供一个很好的例子,清楚地表明你的意思。哇-太苛刻了@RobertMcKee不使用
使用(emp)
它创建一个新对象,而不是将成员变量分配给现有对象。我尝试的是一个接一个地分配变量,这正是我心目中的MCVE。问题是,是否有一种方法可以在一条语句中从多个返回列分配多个变量!我不知道如何更好地问。。。显然,对我来说这听起来很清楚。假设变量
emp
的类型实际上是
emp
,上述方法不可能起作用,因为LINQ表达式返回
IEnumerable
IQueryable
,不能将其分配给
emp
类型的变量。我知道,也许你应该等问题有了意义后再尝试回答。应该包括FirstOrDefault(),但我想罗伯特会知道的。有人对反对票非常慷慨!:(无论如何,我不能这么做的原因(这是问题的第一个原因)是对象变量emp已经分配了许多其他变量。由于三个聪明人没有从我的问题中得到它,显然我可以更好地解释它,而不仅仅是说“从不同的来源填充”是的,第一种方法肯定有效。我只是希望有一种方法不必列出单个变量。第二种方法不起作用,因为它会覆盖已经存在的成员变量(这就是问题的原因).谢谢谢谢谢谢。我想知道我不能一次完成所有的作业就足够了:)
// Assume Employee class

var employee = (
    from p in _context.Person
    where  p.PersonID == emp.PersonID 
    select new Employee { 
        emp.PersonID, 
        PersonFirstName = p.FirstName,
        PersonLastName = p.LastName
    }
).First();