C# 通过将Tablename、ColumnName和value作为参数传递,动态Linq从实体中搜索
我需要在DAL中编写一个名为C# 通过将Tablename、ColumnName和value作为参数传递,动态Linq从实体中搜索,c#,linq,entity-framework,C#,Linq,Entity Framework,我需要在DAL中编写一个名为IsExists(string TableName、string KeyColumnName、string ValueToCheck)的函数,用于检查数据是否存在于特定的表和我要传递的特定列中 基本上,当我尝试在sql查询中设置时,我希望实现类似的功能 select count(id) from "+TableName+" where "+keyColumnName+"="+ValueToCheck+"; 但是我不能使用sql查询 在我的解决方案中,我有一个.edm
IsExists(string TableName、string KeyColumnName、string ValueToCheck)
的函数,用于检查数据是否存在于特定的表和我要传递的特定列中
基本上,当我尝试在sql查询中设置时,我希望实现类似的功能
select count(id) from "+TableName+" where "+keyColumnName+"="+ValueToCheck+";
但是我不能使用sql查询
在我的解决方案中,我有一个.edmx文件,一个实体类和一个存储库类,它具有SearchFor
方法:
public class EntityRepository<C, TEntity> : IEntityRepository<TEntity>
where TEntity : class
where C : DbContext
{
public IQueryable<TEntity> SearchFor(System.Linq.Expressions.Expression<Func<TEntity, bool>> predicate)
{
return _entities.Set<TEntity>().Where(predicate);
}
}
公共类EntityRepository:EntityRepository
地点:班级
其中C:DbContext
{
公共IQueryable搜索(System.Linq.Expressions.Expression谓词)
{
返回_entities.Set(),其中(谓词);
}
}
我试过这样的东西
public bool CheckIsExists<T>(string keyColumnName, string valueToCheck) where T : class
{
bool isExist = false;
using (var repository = ContextFactory.CreateEmployeeMasterRepository())
{
var repo = repository.GetEntityRepository<T>();
object obj = (T)Activator.CreateInstance(type);
repo.SearchFor(u => u.GetType().GetProperty(keyColumnName).GetValue(obj).ToString() == valueToCheck);
}
return isExist;
}
public bool CheckIsExists(string-keyColumnName,string-valueToCheck),其中T:class
{
bool isExist=false;
使用(var repository=ContextFactory.CreateEmployeeMasterRepository())
{
var repo=repository.GetEntityRepository();
对象obj=(T)Activator.CreateInstance(类型);
搜索(u=>u.GetType().GetProperty(keyColumnName).GetValue(obj).ToString()==valueToCheck);
}
返回是存在的;
}
这同样不起作用
有人帮我做这件事。我已经试了很久了。。非常感谢您的建议。您可以从dbcontext执行sql查询:
using (var ctx = new DBEntities())
{
var itemsCount = ctx.Database.SqlQuery<int>("select count(id) from "+TableName+" where "+keyColumnName+" = "+ValueToCheck+").FirstOrDefault<int>();
}
使用(var ctx=new DBEntities())
{
var itemsCount=ctx.Database.SqlQuery(“从“+TableName+”中选择计数(id),其中“+keyColumnName+”=“+ValueToCheck+”)。FirstOrDefault();
}
以下是我解决此类问题的方法。如果您愿意,可以将其转换为函数
// Let's say I have a Customers table and want to search against its Email column
// First I get my data layer class that inherits from DbContext class
yourContextClass db = new yourContextClass();
// below I am getting valueToCheck from a view with GET method
public ActionResult Index(string valueToCheck)
{
bool isExists = false;
IEnumerable<Customers> customersList = (from cus in db.Customers select cus).ToList();
int index = customersList.FindIndex(c => c.Email == valueToCheck);
if (index >= 0)
isExists = True;
// if index is -1 then the value to check does not exist
return View();
}
//假设我有一个Customers表,并希望根据其电子邮件列进行搜索
//首先,我得到从DbContext类继承的数据层类
yourContextClass db=新建yourContextClass();
//下面,我将使用GET方法从视图中获取valueToCheck
公共操作结果索引(字符串值检查)
{
bool-isExists=false;
IEnumerable customersList=(从数据库中的cus.Customers选择cus.ToList();
int index=customersList.FindIndex(c=>c.Email==valueToCheck);
如果(索引>=0)
isExists=真;
//如果索引为-1,则要检查的值不存在
返回视图();
}
您应该检查我自己关于动态LINQ的问题:1)似乎除了entityframework之外,您这里还有一个框架,我建议您在转到泛型之前,先让它与已知类型/对象一起工作。2)在小型控制台项目中先在没有数据库的情况下模拟这是一个非常糟糕的解决方案。查询传递给如果用户查询名为;truncate table Customers--
的表,则数据库将保持原样,而不会转义。无论如何都要避免这种情况。