存储库模式中带有IN子句的实体框架

时间:2014-07-10 17:55:56

标签: entity-framework entity-framework-5 entity-framework-4.1

我正在寻找有关如何在存储库模式中实现IN子句的一些帮助。我不会对每个记录进行单个调用,而是使用一组ID,将此ID传递给Context,以使用具有EF的存储库模式来获取满足条件的实体。

我知道我们可以拥有这样的东西:

context.Students.Where( x => StudentIDs.contains(x.ID))

如何通过单次调用DB在存储库层或模式中实现它?

1 个答案:

答案 0 :(得分:0)

如果你真的是一个纯粹主义者,那么你应该像你似乎暗示的那样完全抽象DbContext

我不确定我是否完全理解这个问题,但是这样的事情应该可以解决这个问题:

namespace EFRepo
{
    class Student
    {
        public long Id { get; set; }
        public string Name { get; set; }
    }

    class SchoolContext : DbContext
    {
        public DbSet<Student> Students { get; set; }
    }

    class SchoolRepository
    {
        private SchoolContext context = new SchoolContext();

        public Student Add(string name)
        {
            Student student = new Student { Name = name };

            context.Students.Add(student);

            context.SaveChanges();

            return student;
        }

        public IEnumerable<Student> GetStudentsByIds(IEnumerable<long> ids)
        {
            return context.Students.Where(x => ids.Contains(x.Id));
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            SchoolRepository repo = new SchoolRepository();

            repo.Add("Bully");
            repo.Add("Crawler");
            repo.Add("Tart");

            foreach (Student s in repo.GetStudentsByIds(new[] { 1L, 3 }))
            {
                Console.WriteLine(s.Name);
            }
        }
    }
}