PDA

View Full Version : سوال: نحوه استفاده از stored procedure در UnitOfWork چگونه است



Iran58
چهارشنبه 12 تیر 1398, 14:20 عصر
سلام
من یک برنامه تحت ModelFirst براساس UnitOfWork نوشته ام
اما می خواهم از sp که نوشته ام در Repository خودم استفاده کنم
اما نمی دانم چگونه این sp را در Repository مورد نظر فراخوانی کنم

public interface IMenuRepository : IRepository<Menu>
{
IEnumerable<Menu> MenuLists();
}

public class MenuRepository : Repository<Menu>, IMenuRepository
{
private readonly TestCRUDSignalREntitie _context;
public MenuRepository(TestCRUDSignalREntitie context) : base(context)
{
_context = context;
}
public TestCRUDSignalREntitie DatabaseContext => Context as TestCRUDSignalREntitie;




public IEnumerable<Menu> MenuLists()
{
///!!!!!!!!!!!!!!!!!!????????????
//return _context.Menus
}


}





public interface IUnitOfWork : IDisposable
{
IMenuRepository MenuRepository { get; }


int Complete();
}

public class UnitOfWork : IUnitOfWork
{
private readonly TestCRUDSignalREntitie _context;
public IMenuRepository MenuRepository { get; private set; }
public UnitOfWork(TestCRUDSignalREntitie context)
{
_context = context;
MenuRepository = new MenuRepository(_context);
}
public int Complete()
{
return _context.SaveChanges();
}


public void Dispose()
{
_context.Dispose();
}
}

namespace WindowsFormsApp1
{
public interface IRepository<TEntity> where TEntity : class
{


TEntity Get(object id);




IEnumerable<TEntity> GetAll();




TEntity GetRow();




TEntity GetAllEntity();




IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> perdicate);






TEntity FindSelect(Expression<Func<TEntity, bool>> perdicate);


bool FindRow(Expression<Func<TEntity, bool>> perdicate);




IEnumerable<TEntity> FindRawSql(string query, params object[] parameters);




void Add(TEntity entity);




void AddRange(IEnumerable<TEntity> entities);




void Remove(TEntity entity);




void RemoveRange(IEnumerable<TEntity> entities);


void Update(TEntity entity);


}
}

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
protected readonly DbContext Context;


public Repository(DbContext context)
{
Context = context;
}


public virtual TEntity Get(object id)
{
return Context.Set<TEntity>().Find(id);
}


public virtual IEnumerable<TEntity> GetAll()
{
return Context.Set<TEntity>().ToList();
}


public virtual TEntity GetRow()
{
return Context.Set<TEntity>().FirstOrDefault();
}


public virtual TEntity GetAllEntity()
{
return Context.Set<TEntity>().FirstOrDefault();
}


public virtual IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
{
return Context.Set<TEntity>().Where(predicate);
}




public virtual TEntity FindSelect(Expression<Func<TEntity, bool>> predicate)
{
return Context.Set<TEntity>().Where(predicate).FirstOrDefault();
}


public virtual bool FindRow(Expression<Func<TEntity, bool>> predicate)
{
var check = Context.Set<TEntity>().Where(predicate).SingleOrDefault();
return check != null;
}


public IEnumerable<TEntity> FindRawSql(string query, params object[] parameters)
{
return Context.Set<TEntity>().SqlQuery(query, parameters).ToList();
}


public virtual void Add(TEntity entity)
{
Context.Set<TEntity>().Add(entity);
}


public virtual void AddRange(IEnumerable<TEntity> entities)
{
Context.Set<TEntity>().AddRange(entities);
}


public virtual void Remove(TEntity entity)
{
Context.Set<TEntity>().Remove(entity);
}


public virtual void RemoveRange(IEnumerable<TEntity> entities)
{
Context.Set<TEntity>().RemoveRange(entities);
}


public virtual void Update(TEntity entity)
{
Context.Set<TEntity>().Attach(entity);
Context.Entry(entity).State = EntityState.Modified;
}




}

hafez1366
جمعه 14 تیر 1398, 10:42 صبح
در اینترفیس IUnitOfWork این امضاء رو اضافه کن:

IEnumerable ExecuteReader(string storedProcedureName, SqlParameter[] parameters = null);



در کلاس UnitOfWork هم این متد رو پیاده سازی کن:

public IEnumerable ExecuteReader(string storedProcedureName, SqlParameter[] parameters = null)
{
if (parameters != null && parameters.Any())
{
var parameterBuilder = new StringBuilder();
parameterBuilder.Append(string.Format("EXEC {0} ", storedProcedureName));


for (int i = 0; i < parameters.Length; i++)
{
if (parameters[i].SqlDbType == SqlDbType.VarChar
|| parameters[i].SqlDbType == SqlDbType.NVarChar
|| parameters[i].SqlDbType == SqlDbType.Char
|| parameters[i].SqlDbType == SqlDbType.NChar
|| parameters[i].SqlDbType == SqlDbType.Text
|| parameters[i].SqlDbType == SqlDbType.NText)
{
parameterBuilder.Append(string.Format("{0}='{1}'", parameters[i].ParameterName,
string.IsNullOrEmpty(parameters[i].Value.ToString())
? string.Empty : parameters[i].Value.ToString()));
}
else if (parameters[i].SqlDbType == SqlDbType.BigInt
|| parameters[i].SqlDbType == SqlDbType.Int
|| parameters[i].SqlDbType == SqlDbType.TinyInt
|| parameters[i].SqlDbType == SqlDbType.Decimal
|| parameters[i].SqlDbType == SqlDbType.Float
|| parameters[i].SqlDbType == SqlDbType.Money
|| parameters[i].SqlDbType == SqlDbType.SmallInt
|| parameters[i].SqlDbType == SqlDbType.SmallMoney)
{
parameterBuilder.Append(string.Format("{0}={1}", parameters[i].ParameterName
, parameters[i].Value));
}
else if (parameters[i].SqlDbType == SqlDbType.Bit)
{
parameterBuilder.Append(string.Format("{0}={1}", parameters[i].ParameterName,
Convert.ToBoolean(parameters[i].Value)));
}


if (i < parameters.Length - 1)
{
parameterBuilder.Append(",");
}
}


var query = parameterBuilder.ToString();
var result = context.Database.SqlQuery(query);
return result.ToList();
}
else
{
var result = context.Database.SqlQuery(string.Format("EXEC {0}", storedProcedureName));
return result.ToList();
}
}





در آخر هر جایی خواستی ازش استفاده کن:

unitOfWork.ExecuteReader(commandText, parameters);



برای جزئیات بیشتر هم از این لینک (https://cutly.ir/d2c3cc) استفاده کنید.