Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用First()获取LINQ结果的第二项?_C#_Linq_Entity Framework - Fatal编程技术网

C# 使用First()获取LINQ结果的第二项?

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

我是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

然后我使用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()
方法返回id
6
,因此我假设在上述情况下该方法总是返回第二项。而且它似乎与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()
方法返回id
6
,因此我假设在上述情况下该方法总是返回第二项。而且它似乎与RDBMS没有任何关系。有人能解释一下吗

这也发生在RDBMS中,并且在没有LINQ的情况下是可复制的。这是一个小盒子