使用Entity Framework选择多个列

Ron*_*ald 50 .net c# entity-framework

也许一个简单的问题,但无法轻易找到它原谅我=)我尝试选择多个列.我使用的声明是:

var dataset2 = from recordset in entities.processlists 
               where recordset.ProcessName == processname 
               select recordset.ServerName, recordset.ProcessID, recordset.Username;
Run Code Online (Sandbox Code Playgroud)

显然,这甚至都没有编译.什么是正确的语法?我也试过基于方法,甚至强硬这个语法似乎是正确的,当访问它时抛出'无法强制转换类型'匿名类型'来键入'AIM.PInfo'.LINQ to Entities仅支持转换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();
Run Code Online (Sandbox Code Playgroud)

Réd*_*tar 96

实际上,编译器不知道如何将此匿名类型(new { x.ServerName, x.ProcessID, x.Username }部件)转换为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();
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个可以在之后使用的对象(匿名类型)列表,但您无法返回该对象或将其传递给另一个方法.

如果您的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();
Run Code Online (Sandbox Code Playgroud)

假设PInfo至少具有这三个属性.

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


And*_*ard 17

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

var dataset2 = 
    (from recordset in entities.processlists 
    where recordset.ProcessName == processname 
    select new
    {
        serverName = recordset.ServerName,
        processId = recordset.ProcessID, 
        username = recordset.Username
    }).ToList();
Run Code Online (Sandbox Code Playgroud)

或者,您可以创建一个代表您的选择的新类

public class MyDataSet
{
    public string ServerName { get; set; }
    public string ProcessId { get; set; }
    public string Username { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

那么你可以举例如下

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


小智 5

为什么不在以下位置创建新对象.Select:

.Select(x => new PInfo{ 
    ServerName = x.ServerName, 
    ProcessID = x.ProcessID, 
    UserName = x.Username }).ToList();
Run Code Online (Sandbox Code Playgroud)


Say*_*emi 5

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

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 
              });
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅: 无法在 LINQ to Entities 查询中构造实体