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