也许是一个简单的问题,但无法轻易找到它,请原谅我=) 我尝试选择多个列。我使用的陈述是:
var dataset2 = from recordset in entities.processlists
where recordset.ProcessName == processname
select recordset.ServerName, recordset.ProcessID, recordset.Username;
显然,这甚至都没有编译。什么是正确的语法? 我也试过基于方法,甚至强硬这个语法似乎是正确的,当访问它时抛出'无法强制转换类型'匿名类型'来键入'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();
答案 0 :(得分:92)
实际上,编译器不知道如何将此匿名类型(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();
这为您提供了之后可以使用的对象(匿名类型)的列表,但是您无法将其返回或传递给另一个方法。
如果你的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至少有这三个属性。
这两个查询都允许您仅提取所需的列,但使用现有类型(如第二个查询中)允许您将此数据发送到应用的其他部分。
答案 1 :(得分:15)
您可以选择匿名类型,例如
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();
答案 2 :(得分:5)
为什么不在.Select
:
.Select(x => new PInfo{
ServerName = x.ServerName,
ProcessID = x.ProcessID,
UserName = x.Username }).ToList();
答案 3 :(得分:3)
您要么选择匿名类型:
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
};
答案 4 :(得分:1)
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
答案 5 :(得分:0)
获取指定类型的数据是正确的方法:
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
});
有关更多信息,请参阅: The entity cannot be constructed in a LINQ to Entities query
答案 6 :(得分:-1)
以下是代码示例:
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();