C# 在C中使用通用存储库时连接多个表#
我有一个.Net解决方案,其中包含多个层项目,如下所示C# 在C中使用通用存储库时连接多个表#,c#,mysql,linq,entity-framework-6,repository-pattern,C#,Mysql,Linq,Entity Framework 6,Repository Pattern,我有一个.Net解决方案,其中包含多个层项目,如下所示 业务(解决方案文件夹) 核心(项目) 接口(项目) 数据(解决方案文件夹) 数据(项目) 演示文稿(解决方案文件夹) 行政小组(项目) 共享(解决方案文件夹) 普通(项目) 我已经使用Unity(即Microsoft.Practices.Unity)实现了IoC层的通用存储库模式。除了我想做多表简单连接或复杂连接之外,其他一切都很好。我试过很多不同的方法。我已经检查了这里的每个现有线程,所以关于存储库中的连接,但没有一个
- 业务(解决方案文件夹)
- 核心(项目)
- 接口(项目)
- 数据(解决方案文件夹)
- 数据(项目)
- 演示文稿(解决方案文件夹)
- 行政小组(项目)
- 共享(解决方案文件夹)
- 普通(项目)
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity
{
protected BuyatimeshareModel Context { get; private set; }
public Repository(IContextFactory contextFactory)
: this(contextFactory.Get())
{
}
protected Repository(BuyatimeshareModel context)
{
context.Database.Log = message => { Common.Logging.Log(message); };
Context = context;
}
IDbSet<TEntity> DbSet
{
get
{
return Context.Set<TEntity>();
}
}
public TEntity Add(TEntity instance)
{
DbSet.Add(instance);
Context.SaveChanges();
return instance;
}
public void Remove(TEntity instance)
{
DbSet.Remove(instance);
Context.SaveChanges();
}
public TEntity FindOne(Expression<Func<TEntity, bool>> predicate)
{
return DbSet.AsQueryable().FirstOrDefault(predicate);
}
public IEnumerable<TEntity> All()
{
return DbSet.AsQueryable();
}
public IEnumerable<TEntity> Query() { IQueryable<TEntity> query = DbSet; return query.ToList(); }
public IEnumerable<TEntity> FindAll(Expression<Func<TEntity, bool>> predicate)
{
return DbSet.AsQueryable().Where(predicate);
}
public int Count()
{
return DbSet.AsQueryable().Count();
}
public int Count(Expression<Func<TEntity, bool>> predicate)
{
return DbSet.AsQueryable().Count(predicate);
}
public bool Exists(Expression<Func<TEntity, bool>> predicate)
{
return DbSet.AsQueryable().Any(predicate);
}
}
public class UnityControllerFactory : DefaultControllerFactory
{
IUnityContainer container;
public UnityControllerFactory(IUnityContainer container)
{
this.container = container;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
try
{
if (controllerType == null)
throw new ArgumentNullException("controllerType");
if (!typeof(IController).IsAssignableFrom(controllerType))
throw new ArgumentException(string.Format(
"Type requested is not a controller: {0}", controllerType.Name),
"controllerType");
return container.Resolve(controllerType) as IController;
}
catch { return null; }
}
public static void Configure()
{
IUnityContainer container = new UnityContainer();
/*string connectionString = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;*/
container.RegisterType<IContextFactory, ContextFactory>(new ContainerControlledLifetimeManager())//, new InjectionConstructor(connectionString))
.RegisterType<IUnitOfWork, UnitOfWork>(new ContainerControlledLifetimeManager())
.RegisterType<IAdminService, AdminService>()
.RegisterType(typeof(IRepository<>), typeof(Repository<>));
ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));
}
}
public class AdminService : IAdminService
{
private readonly IRepository<press_releases> pressReleasesRepo;
private readonly IRepository<tblads> adsRepo;
private readonly IRepository<tblresorts> resortsRepo;
public AdminService(IRepository<press_releases> _pressReleasesRepo, IRepository<tblads> _adsRepo, IRepository<tblresorts> _resortsRepo)
{
pressReleasesRepo = _pressReleasesRepo;
adsRepo = _adsRepo;
resortsRepo = _resortsRepo;
}
public List<press_releases> Test()
{
var data = pressReleasesRepo.FindAll(p => p.pr_id > 0);
var data1 =
(from a in adsRepo.Query()
join r in resortsRepo.Query() on a.resort_id equals r.resort_id
where a.ad_id == 413
select new
{
OwnerId = a.owner_id,
ResortName = r.name,
AdId = a.ad_id,
AskingPrice = a.askingPriceInt
}).ToList();
var model = data.ToList();
return model;
}
}
以下是存储库中的方法,您正在数据1中使用该方法
public IEnumerable<TEntity> Query() { IQueryable<TEntity> query = DbSet; return query.ToList(); }
public IEnumerable Query(){IQueryable Query=DbSet;return Query.ToList();}
每当您点击“.ToList()”时,它都会点击数据库
如果要先创建查询,然后执行,请使用存储库的“DbSet”属性。以下是存储库中的方法,您正在数据1中使用该方法
public IEnumerable<TEntity> Query() { IQueryable<TEntity> query = DbSet; return query.ToList(); }
public IEnumerable Query(){IQueryable Query=DbSet;return Query.ToList();}
每当您点击“.ToList()”时,它都会点击数据库
如果要先创建查询,然后执行,请使用存储库的“DbSet”属性。非常感谢您的回复。我在前面的问题中已经提到过这一点,我知道我返回的是IEnumerable类型,而不是IQueryable,即立即查询与延迟查询。但这给了我一个错误,不同的背景。因此,我无法跳过.ToList(),因为这样。我希望这能解释我的问题。你能发布与ContextFactory相关的代码吗。您正在从中获取DBContext,它是每次创建该上下文还是缓存该上下文。请在ContextFactory中添加GUID字段,并在每次获取时记录该字段,然后查看它们是否相同。有关更多测试方法的建议,请参见此链接。我想我能看出问题从一开始就在哪里。我已经用ContextFactory类内容更新了我的问题。它确实为每个get()调用返回一个新实例。我想我必须改变它的实现,使它成为一个单例类。Unity容器本身被要求将ContextFactory注册为singleton,但我从中返回的模型在每次调用的基础上是唯一的,这是不应该的。非常感谢您的回复。我在前面的问题中已经提到过这一点,我知道我返回的是IEnumerable类型,而不是IQueryable,即立即查询与延迟查询。但这给了我一个错误,不同的背景。因此,我无法跳过.ToList(),因为这样。我希望这能解释我的问题。你能发布与ContextFactory相关的代码吗。您正在从中获取DBContext,它是每次创建该上下文还是缓存该上下文。请在ContextFactory中添加GUID字段,并在每次获取时记录该字段,然后查看它们是否相同。有关更多测试方法的建议,请参见此链接。我想我能看出问题从一开始就在哪里。我已经用ContextFactory类内容更新了我的问题。它确实为每个get()调用返回一个新实例。我想我必须改变它的实现,使它成为一个单例类。Unity容器本身被要求将ContextFactory注册为singleton,但我从中返回的模型在每次调用的基础上是唯一的,这是不应该的。