C# 使用实体框架选择多个列

C# 使用实体框架选择多个列,c#,.net,entity-framework,C#,.net,Entity Framework,也许这是个简单的问题,但找不到,所以请原谅我=) 我尝试选择多个列。我使用的声明是: var dataset2 = from recordset in entities.processlists where recordset.ProcessName == processname select recordset.ServerName, recordset.ProcessID, recordset.Username; 显然,这甚至

也许这是个简单的问题,但找不到,所以请原谅我=) 我尝试选择多个列。我使用的声明是:

var dataset2 = from recordset in entities.processlists 
               where recordset.ProcessName == processname 
               select recordset.ServerName, recordset.ProcessID, recordset.Username;
显然,这甚至不需要编译。正确的语法是什么? 我还尝试了基于方法的,甚至很难理解的语法,当访问它时,它会抛出一个“无法将类型‘匿名类型’转换为类型‘AIM.PInfo’”。LINQ to实体仅支持强制转换EDM基元或枚举类型。异常

有什么想法吗

var dataset = entities.processlists
             .Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart)
             .Select(x => new { x.ServerName, x.ProcessID, x.Username })
             .Cast<PInfo>().ToList();
var dataset=entities.processlist
.Where(x=>x.environmentID==environmentID&&x.ProcessName==ProcessName&&x.RemoteIP==RemoteIP&&x.CommandLine==commandlinepart)
.Select(x=>new{x.ServerName,x.ProcessID,x.Username})
.Cast().ToList();

例如,您可以选择匿名类型

var dataset2 = 
    (from recordset in entities.processlists 
    where recordset.ProcessName == processname 
    select new
    {
        serverName = recordset.ServerName,
        processId = recordset.ProcessID, 
        username = recordset.Username
    }).ToList();
public class MyDataSet
{
    public string ServerName { get; set; }
    public string ProcessId { get; set; }
    public string Username { get; set; }
}
或者,您可以创建一个新类来表示您的选择,例如

var dataset2 = 
    (from recordset in entities.processlists 
    where recordset.ProcessName == processname 
    select new
    {
        serverName = recordset.ServerName,
        processId = recordset.ProcessID, 
        username = recordset.Username
    }).ToList();
public class MyDataSet
{
    public string ServerName { get; set; }
    public string ProcessId { get; set; }
    public string Username { get; set; }
}
例如,您可以执行以下操作

 var dataset2 = 
    (from recordset in entities.processlists 
    where recordset.ProcessName == processname 
    select new MyDataSet
    {
        ServerName = recordset.ServerName,
        ProcessId = recordset.ProcessID, 
        Username = recordset.Username
    }).ToList();

您可以选择匿名类型:

var dataset2 = from recordset 
               in entities.processlists 
               where recordset.ProcessName == processname 
               select new 
               {
                recordset.ServerName, 
                recordset.ProcessID, 
                recordset.Username
               };
但是你不能把它转换成另一种类型,所以我想你想要这样的东西:

var dataset2 = from recordset 
               in entities.processlists 
               where recordset.ProcessName == processname 

               // Select new concrete type
               select new PInfo
               {
                ServerName = recordset.ServerName, 
                ProcessID = recordset.ProcessID, 
                Username = recordset.Username
               };

为什么不直接在
中创建一个新对象。选择

.Select(x => new PInfo{ 
    ServerName = x.ServerName, 
    ProcessID = x.ProcessID, 
    UserName = x.Username }).ToList();

实际上,编译器不知道如何将这个匿名类型(新的{x.ServerName,x.ProcessID,x.Username}
part)转换为PInfo对象

var dataset = entities.processlists
    .Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart)
    .Select(x => new { x.ServerName, x.ProcessID, x.Username }).ToList();
这将为您提供一个可以在以后使用的对象列表(匿名类型),但您不能返回该列表或将其传递给另一个方法

如果PInfo对象具有正确的属性,则可以如下所示:

var dataset = entities.processlists
    .Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart)
    .Select(x => new PInfo 
                 { 
                      ServerName = x.ServerName, 
                      ProcessID = x.ProcessID, 
                      UserName = x.Username 
                 }).ToList();
假设PInfo至少具有这三个属性


这两个查询都允许您仅获取所需的列,但使用现有类型(如第二个查询)允许您将此数据发送到应用程序的其他部分。

获取指定类型数据的正确方法是:

var test_obj = from d in repository.DbPricing
join d1 in repository.DbOfficeProducts on d.OfficeProductId equals d1.Id
join d2 in repository.DbOfficeProductDetails on d1.ProductDetailsId equals d2.Id
    select new
    {
    PricingId = d.Id,
    LetterColor = d2.LetterColor,
    LetterPaperWeight = d2.LetterPaperWeight
    };


http://www.cybertechquestions.com/select-across-multiple-tables-in-entity-framework-resulting-in-a-generic-iqueryable_222801.html
var dataset = entities.processlists
         .Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart)
         .Select(x => new { x.ServerName, x.ProcessID, x.Username })
         .ToList() /// To get data from database
         .Select(x => new PInfo()
              { 
                   ServerName = x.ServerName, 
                   ProcessID = x.ProcessID, 
                   Username = x.Username 
              });
有关更多信息,请参阅:
以下是一个代码示例:

var dataset = entities.processlists
    .Where(x => x.environmentID == environmentid && x.ProcessName == processname && x.RemoteIP == remoteip && x.CommandLine == commandlinepart)
    .Select(x => new PInfo 
                 { 
                      ServerName = x.ServerName, 
                      ProcessID = x.ProcessID, 
                      UserName = x.Username 
                 }) AsEnumerable().
               Select(y => new PInfo
               {
                   ServerName = y.ServerName,
                   ProcessID = y.ProcessID,
                   UserName = y.UserName 
               }).ToList();

第二个例子非常有效,非常感谢。我在遍历每个对象时遇到性能问题。这帮助我从数据库中选择一次,然后在代码/内存中执行其余操作。