C# 使用First()获取LINQ结果的第二项?
我是Linq和EntityFramework的新手。这是我在学习过程中遇到的一个示例程序 表中的数据如下所示:C# 使用First()获取LINQ结果的第二项?,c#,linq,entity-framework,C#,Linq,Entity Framework,我是Linq和EntityFramework的新手。这是我在学习过程中遇到的一个示例程序 表中的数据如下所示: BlogId Title 1 Hello Blog 2 New Blog 3 New Blog BlogId Title 5 New Blog 6 New Blog 7 New Blog 8 New Blog 我有以下Linq代码,试图读取第一个博客id(预计为2): 结果是3 然后我使用ToL
BlogId Title
1 Hello Blog
2 New Blog
3 New Blog
BlogId Title
5 New Blog
6 New Blog
7 New Blog
8 New Blog
我有以下Linq代码,试图读取第一个博客id(预计为2):
结果是3
然后我使用ToList():
结果是2
有人能解释一下吗?还是这是一只虫子
谢谢
////////////////////////更新/////////////////////////////
我刚刚删除了数据库中的数据并插入了一些新项目。现在这个表是这样的:
BlogId Title
1 Hello Blog
2 New Blog
3 New Blog
BlogId Title
5 New Blog
6 New Blog
7 New Blog
8 New Blog
然后我运行上面的程序(不是使用ToList()),第一个()方法返回id6
因此,我假设在上述情况下,该方法总是返回2nd项。而且它似乎与RDBMS没有任何关系。有人能解释一下吗 谢谢 ///////////////////////////////////////////////////// 仅供参考,以下是整个.cs文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
namespace SampleNew
{
class Program
{
public class Blog
{
[Key]
public Int32 BlogId { get; set; }
public String Title { get; set; }
public virtual List<Post> Posts { get; set; }
}
public class Post
{
[Key]
public Int32 PostId { get; set; }
public String Title{ get; set; }
public String Content { get; set; }
}
public class BlogContext : DbContext
{
public DbSet<Blog> Blogs{ get; set; }
public DbSet<Post> Posts { get; set; }
}
static void Main(string[] args)
{
using (var db = new BlogContext())
{
// Create and save a new Blog
// Console.Write("Enter a name for a new Blog: ");
var name = "New Blog";
//var blog = new Blog { Title = name };
var blogs = (from b in db.Blogs
where b.Title == name
orderby b.Title
select b).ToList();
Console.Write("The first id: ");
Console.WriteLine(blogs.First().BlogId);
Console.WriteLine(blogs.Count());
Blog blog = null;
foreach (Blog b in blogs)
{
blog = b;
Console.WriteLine(blog.BlogId);
}
Console.WriteLine(blog.BlogId);
Console.WriteLine(blogs.First().BlogId);
Console.WriteLine(blogs.First().BlogId);
Console.WriteLine(blogs.Last().BlogId);
Console.WriteLine(blogs.Last().BlogId);
blog.Posts = new List<Post>();
var post = new Post { Content = "Test Content2", Title = "Test Title2"};
blog.Posts.Add(post);
db.Posts.Add(post);
db.SaveChanges();
// Display all Blogs from the database
var query = from b in db.Blogs
orderby b.Title
select b;
Console.WriteLine("All blogs in the database:");
foreach (var item in query)
{
Console.WriteLine(item.Title);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Data.Entity;
使用System.ComponentModel.DataAnnotations;
名称空间SampleNew
{
班级计划
{
公共类博客
{
[关键]
public Int32 BlogId{get;set;}
公共字符串标题{get;set;}
公共虚拟列表发布{get;set;}
}
公营职位
{
[关键]
public Int32 PostId{get;set;}
公共字符串标题{get;set;}
公共字符串内容{get;set;}
}
公共类BlogContext:DbContext
{
公共数据库集博客{get;set;}
公共DbSet Posts{get;set;}
}
静态void Main(字符串[]参数)
{
使用(var db=new BlogContext())
{
//创建并保存新博客
//Write(“输入新博客的名称:”);
var name=“新建博客”;
//var blog=newblog{Title=name};
var blogs=(来自db.blogs中的b)
其中b.Title==name
orderby b.标题
选择b).ToList();
Console.Write(“第一个id:”);
Console.WriteLine(blogs.First().BlogId);
Console.WriteLine(blogs.Count());
Blog=null;
foreach(博客中的博客b)
{
blog=b;
Console.WriteLine(blog.BlogId);
}
Console.WriteLine(blog.BlogId);
Console.WriteLine(blogs.First().BlogId);
Console.WriteLine(blogs.First().BlogId);
Console.WriteLine(blogs.Last().BlogId);
Console.WriteLine(blogs.Last().BlogId);
blog.Posts=新列表();
var post=new post{Content=“Test Content2”,Title=“Test Title2”};
blog.Posts.Add(post);
db.Posts.Add(post);
db.SaveChanges();
//显示数据库中的所有博客
var query=来自db.Blogs中的b
orderby b.标题
选择b;
WriteLine(“数据库中的所有博客:”);
foreach(查询中的var项)
{
控制台写入线(项目名称);
}
Console.WriteLine(“按任意键退出…”);
Console.ReadKey();
}
}
}
}
您有两个相同的标题,但ID不同。您的RDBMS可以灵活地返回与您的'New Blog'
对应的行,因为您的代码没有指定任何超出标题排序要求的内容。此外,每次运行相同的查询时,甚至不需要以相同的顺序返回结果
如果希望得到可预测的结果,请在LINQ语句中添加“then by”,以强制执行您希望的排序:
var query = from b in db.Blogs
orderby b.Title, b.BlogId
select b;
编辑:
当我运行上面的程序时,
First()
方法返回id6
,因此我假设在上述情况下该方法总是返回第二项。而且它似乎与RDBMS没有任何关系。有人能解释一下吗
这也发生在RDBMS中,并且在没有LINQ的情况下是可复制的。下面是一个小演示():
此查询按“自然”顺序生成结果:
但是,EF运行此查询来获取RDBMS中的First()
项
SELECT TOP 1 * FROM Blogs ORDER BY Title
按自然顺序返回第二行:
BLOGID TITLE
------ --------
5 New blog
6 New blog
7 New blog
8 New blog
BLOGID TITLE
------ --------
6 New blog
这并不意味着它将返回其他RDBMS()中的同一行,甚至是同一RDBMS中的同一行。它只是演示了LINQ依赖RDBMS选择行,RDBMS返回任意选择的行。这里有两个相同的标题,但ID不同。您的RDBMS可以灵活地返回与您的
'New Blog'
对应的行,因为您的代码没有指定任何超出标题排序要求的内容。此外,每次运行相同的查询时,甚至不需要以相同的顺序返回结果
如果希望得到可预测的结果,请在LINQ语句中添加“then by”,以强制执行您希望的排序:
var query = from b in db.Blogs
orderby b.Title, b.BlogId
select b;
编辑:
当我运行上面的程序时,
First()
方法返回id6
,因此我假设在上述情况下该方法总是返回第二项。而且它似乎与RDBMS没有任何关系。有人能解释一下吗
这也发生在RDBMS中,并且在没有LINQ的情况下是可复制的。这是一个小盒子