据我所知,还没有一种方法可以从Single语句的输出中选择信息。这意味着不可能这样写:
var playerIdName = context.Players
.Single(p => p.ID == playerID)
.Select(p => new
{
ID = p.ID,
Name = p.Name + " " + p.LastName,
});
相反,您可以通过以下两种方式编写:
var playerIdName = context.Players
.Select(p => new
{
ID = p.ID,
Name = p.Name + " " + p.LastName,
})
.Single(p => p.ID == playerID);
要么
var playerIdName = context.Players
.Where(p => p.ID == playerID)
.Select(p => new
{
ID = p.ID,
Name = p.Name + " " + p.LastName,
}).Single(p => p.ID == playerID);
但是它们似乎都效率极低。关于这两个语句的效率的任何建议,以及从选定项目中分开获取信息以做出两个不同语句的更好方法是什么,例如:
var player = context.Players
.Single(p => p.ID == playerID);
var playerIdName = new
{
ID = player .ID,
Name = player .Name + " " + player .LastName,
};
怎么样:
var playerIdName = context.Players
.Where(p => p.ID == playerID)
.Take(1)
.Select(p => new
{
ID = p.ID,
Name = p.Name + " " + p.LastName,
})
.Single();
Take(1)将获取第一个与Where()中的过滤器匹配的对象,Select()将其投影,然后Single()然后执行整个集合。Where()中的迭代器将仅进行迭代,直到找到第一个匹配项为止。
我没有测试EF是否能够将其转换为SQL。
谢谢,我将在几个小时后进行测试,并给您答复。我想无论如何,最后一个.Single()是没有必要的,因为Take()的输出已经是单个元素。
不同之处在于Single()使playerIdName成为Player类型,而没有Single()则playerIdName变量将为IQueryable <Player>类型。
没错,Single()有助于获取正确的类型。并将Take(1)放在Where工作之后。非常感谢你。