如何根据条件从linq查询中获取100条记录

时间:2016-03-22 07:37:17

标签: c# linq

我有一个查询,它将给出结果集。根据条件我想拍100条记录。这意味着。我有一个变量x,如果x的值是100那么我必须做.take(100)否则我需要得到完整的记录。

var abc=(from st in Context.STopics 
where  st.IsActive==true && st.StudentID == 123 
select new result()
{
 name = st.name }).ToList().Take(100);

3 个答案:

答案 0 :(得分:8)

因为LINQ返回一个延迟执行的IQueryable,您可以创建查询,然后在条件为真时将其限制为前100条记录,然后获取结果。这样,如果您的条件是假的,您将获得所有结果。

var abc = (from st in Context.STopics 
where st.IsActive && st.StudentID == 123 
select new result
{
 name = st.name
});
if (x == 100)
  abc = abc.Take(100);
abc = abc.ToList();

请注意,在Take之前执行ToList非常重要,否则,它会检索所有记录,然后只保留前100个 - 只获取前者更有效率您需要的记录,特别是如果它是对可能包含数十万行的数据库表的查询。

答案 1 :(得分:6)

SQL TOP命令中最重要的概念之一是order by。您不应在没有TOP的情况下使用order by,因为它可能会在不同情况下返回不同的结果。

同样的概念也适用于linq。

 var results = Context.STopics.Where(st => st.IsActive && st.StudentID == 123)
              .Select(st => new result(){name = st.name})
              .OrderBy(r => r.name)                 
              .Take(100).ToList();

只对有序集合定义了Take和Skip操作。 More info

答案 2 :(得分:0)

虽然其他用户提供您想要的结果是正确的......

这不是您应该如何使用实体框架。

这是使用EF的更好方法。

var query = from student in Context.Students
            where student.Id == 123
            from topic in student.Topics
            order by topic.Name
            select topic;

请注意结构如何更紧密地遵循业务要求的逻辑。

您几乎可以阅读英文代码。