使用entity frameworkselect多个列

也许一个简单的问题,但无法轻松find它,所以原谅我=)我尝试select多个列。 我使用的陈述是:

var dataset2 = from recordset in entities.processlists where recordset.ProcessName == processname select recordset.ServerName, recordset.ProcessID, recordset.Username; 

显然,这甚至没有编译。 什么是正确的语法? 我也试过基于方法,甚至很难这个语法似乎是正确的,当访问它会引发一个'无法转换types'匿名types'键入'AIM.PInfo'。 LINQ to Entities只支持投射EDM原始types或枚举types。 例外。

有任何想法吗?

 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(); 

事实上,编译器不知道如何将这个匿名types( 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(); 

这给你一个你以后可以使用的(匿名types的)对象列表,但是你不能返回它,或者把它传递给另一个方法。

如果你的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至less有这三个属性。

这两个查询允许您只提取想要的列,但使用现有的types(如在第二个查询中)允许您将这些数据发送到您的应用程序的其他部分。

例如,您可以select匿名types

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

或者,您可以创build一个代表您的select的新类,例如

 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(); 

你要么select一个匿名types:

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

但是你不能把它转换成另一种types,所以我想你想要这样的东西:

 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创build一个新的对象:

 .Select(x => new PInfo{ ServerName = x.ServerName, ProcessID = x.ProcessID, UserName = x.Username }).ToList(); 
 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 

萨拉姆。 以指定的types获取数据是正确的方法:

 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 }); 

有关更多信息,请参阅: 实体不能在LINQ to Entities查询中构build

这是一个代码示例:

 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();