我有一个查询,它将给出结果集。根据条件我想拍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);
答案 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;
请注意结构如何更紧密地遵循业务要求的逻辑。
您几乎可以阅读英文代码。