各位大神,本人初学MVC和EF,有一个问题总是想不明白。还请各位大神赐教。
public List<T> GetEntitys(Expression<Func<T, bool>> whereLambds)
{
List<T> li = new List<T>();
try
{
li =dbContext.Set<T>().Where<T>(whereLambds).ToList<T>();
//li = dbContext.Set<T>().ToList<T>();
}
catch (Exception ex)
{
throw;
}
return li;
}
这个是我从网上找到一个封装后的EF查询方法,返回的是LIST<T>的类型,如果是查询单个实体,没有问题。但是如果是使用多个表进行查询的话,怎么去做?如果用var匿名类型,可是我怎么从业务模块里进行使用呢?这块总是搞不明白。不知道各位大神的EF的查询这块是如果操作的?
多表查询,查询出来的数据不能直接.出来,要写对应的实体属性。
如果按照您的说法,那我没一个复杂的查询,都需要预先定义一个存放结果的实体?
@一伙豌豆: 恩,方便序列化对象。
@背叛的冲刷: 那我是不是可以这样理解,我在建模的时候,除了将关系数据库中的表一一对应的建模之外,还需要将自己用的多个表查询后的结果建立对应的实体。
@一伙豌豆: 可以。
@背叛的冲刷: 那如果是这样话,怎么把处理这种多表查询的方法封装成一个通用的方法?
是不是只能用EF的sql语句那种查询方式了?类似下边这种。
public List<T> GetEntitys(string sql, string where)
{
sql = sql + " where 1=1 " + where;
var temp = dbContext.Database.SqlQuery<T>(sql);
return temp.ToList<T>();
}
public List<T> GetEntitys(string sql)
{
var temp = dbContext.Database.SqlQuery<T>(sql);
return temp.ToList<T>();
}
@背叛的冲刷: 虽然大家还是没能彻底解决我的问题,但还是谢谢各位。
查询单个实体没问题还是查询单个表没问题,List<T>可以查询多个实体啊,你把他们都放在list里面,查询单个,还要用firstordefault,EF的多表查询, var heji = (from da in dc.q1
join du in dc.q2
on da.danhao equals du.danhao
where da.hetong == "XXXX"
select new { du.color1, da.danhao, da.riqi, du.zhongliang, du.beizhu }).Distinct();
你可以这样写
因为是初学,我是把每个表都映射成一个实体,所以我这里查单表也就是单个实体没有问题,返回的时候也可以处理。如果用多表查询的话,返回的是匿名类型,那这个匿名类型我在controller里怎么做处理?如果按照您给定的这种写法,那怎么去封装一个通用的查询方法?您这样话,那我岂不是每个复杂的查询都得写这样一个linq语句。我现在做复杂查询的时候,都是写成一个一个视图做处理的。
@一伙豌豆: MVC知识前端的模型, 后台数据处理还是要BLL,DLL,等,controller只是负责调用,返回一个view里面的数据,你要封装,就把他封装到BLL里面,然后再control里面调用,
@不知道风往哪儿吹: 嗯,这个我就是按照您说的都已经封装到BLL中了,我现在不明白的地方就是用EF做数据查询的时候,如果返回的是var,我需要层层传递到BLL中,还得做类型转换。有没有一种方法针对这种多表多条件查询返回的结果,能统一去处理?
返回的类型你可以自己指定啊,你可以先转成list 在返回,或者其他的
@不知道风往哪儿吹: 类似这样的查询,那是不是我要先定义好需要返回的数据的这么一个实体?那这样的话,我岂不是以后有多种查询结果,就要定义多种实体。
既然用EF了,还是别这样写,不好,因为他是延时加载的,直接用主外键约束好点
能不能说解释的详细点,怎么用主外键约束?多谢多谢
不要返回List<T>, 而是返回IQueryable<T>
这样的话可以利用延迟查询, 用返回结果继续拼接你的查询: IQueryable<T>.Join...
等使用的时候再转成List<T>都未迟
嗯,我也看了下,都推荐返回IQueryable<T>,那这个T我是我怎么去处理?是预先都定义好么?比如我有一个三个表做链接查询,但是A表B表C表我只需要其中有用的字段,那最后组成的这个结果,我是不是要预先定义好这个存放这个结果的实体。
@一伙豌豆: T是泛型,这是一种编程思想
这个问题一直困扰着我,至今没有好的解决方案,