美好的一天,
我正在使用linq扩展方法,我有一个表,我需要从我的表课程中提取项目列表,除了一些我不想要的课程。
public class Course
{
public Course()
{
Tags = new HashSet<Tag>();
}
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int Level { get; set; }
public float FullPrice { get; set; }
public virtual Author Author { get; set; }
public int AuthorId { get; set; }
}
这是我到目前为止所做的:
//Get some courses that I do not need.
var coursesDontNeed=_dbContext.courses.where(//here goes condition);
var coursesINeed= _dbContext.Courses.Except(coursesDontNeed);
有没有办法只使用一次访问数据库,而不是写两个不同的linq句子?
由于
答案 0 :(得分:2)
您可以创建LINQ查询表达式,不评估/执行它,但在第二个LINQ查询中使用它。
var courseIdsDontNeed= db.Courses.Where(yourWherePredicateGoesHere).Select(a => a.Id);
var coursesINeed = db.Courses.Where(p => !courseIdsDontNeed.Contains(p.Id) ).ToList();
当您在第二个LINQ查询上调用ToList()
或ToArray()
时,将执行linq表达式,并且只有一个SQL语句(具有过滤逻辑以排除那些项目)针对数据库生成并执行。
将yourWherePredicateGoesHere
替换为您要切换的实际谓词。例如,
var courseIdsDontNeed= db.Courses.Where(a=>a.IsActive).Select(a => a.Id);
答案 1 :(得分:1)
创建一个临时变量来存储表示为列表的_dbContext.Courses
,然后对其进行操作。
var temp = _dbContext.Courses.ToList();
var coursesDontNeed = temp.Where(condition)...
var coursesINeed = temp.Except(coursesDontNeed);
在这种情况下,我们只对_dbContext
进行一次访问,从那里我们无需向_dbContext
请求任何数据。