Linq扩展方法选择不在

时间:2017-11-12 00:04:19

标签: c# asp.net-mvc linq

美好的一天,

我正在使用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句子?

由于

2 个答案:

答案 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请求任何数据。