首页 新闻 会员 周边

EF返回数据处理

0
悬赏园豆:10 [已解决问题] 解决于 2015-08-11 16:14

各位大神,本人初学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的查询这块是如果操作的?

一伙豌豆的主页 一伙豌豆 | 菜鸟二级 | 园豆:209
提问于:2015-08-07 18:08
< >
分享
最佳答案
1

多表查询,查询出来的数据不能直接.出来,要写对应的实体属性。

收获园豆:7
唯我独萌 | 小虾三级 |园豆:537 | 2015-08-10 08:26

如果按照您的说法,那我没一个复杂的查询,都需要预先定义一个存放结果的实体?

一伙豌豆 | 园豆:209 (菜鸟二级) | 2015-08-10 14:06

@一伙豌豆: 恩,方便序列化对象。

唯我独萌 | 园豆:537 (小虾三级) | 2015-08-10 14:08

@背叛的冲刷: 那我是不是可以这样理解,我在建模的时候,除了将关系数据库中的表一一对应的建模之外,还需要将自己用的多个表查询后的结果建立对应的实体。

一伙豌豆 | 园豆:209 (菜鸟二级) | 2015-08-10 14:20

@一伙豌豆: 可以。

唯我独萌 | 园豆:537 (小虾三级) | 2015-08-10 14:22

@背叛的冲刷: 那如果是这样话,怎么把处理这种多表查询的方法封装成一个通用的方法?

是不是只能用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>();
}

一伙豌豆 | 园豆:209 (菜鸟二级) | 2015-08-10 14:32

@背叛的冲刷: 虽然大家还是没能彻底解决我的问题,但还是谢谢各位。

一伙豌豆 | 园豆:209 (菜鸟二级) | 2015-08-11 16:16
其他回答(4)
0

查询单个实体没问题还是查询单个表没问题,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();

你可以这样写

收获园豆:1
不知道风往哪儿吹 | 园豆:2035 (老鸟四级) | 2015-08-07 18:16

因为是初学,我是把每个表都映射成一个实体,所以我这里查单表也就是单个实体没有问题,返回的时候也可以处理。如果用多表查询的话,返回的是匿名类型,那这个匿名类型我在controller里怎么做处理?如果按照您给定的这种写法,那怎么去封装一个通用的查询方法?您这样话,那我岂不是每个复杂的查询都得写这样一个linq语句。我现在做复杂查询的时候,都是写成一个一个视图做处理的。

支持(0) 反对(0) 一伙豌豆 | 园豆:209 (菜鸟二级) | 2015-08-07 18:21

@一伙豌豆: MVC知识前端的模型, 后台数据处理还是要BLL,DLL,等,controller只是负责调用,返回一个view里面的数据,你要封装,就把他封装到BLL里面,然后再control里面调用,

支持(0) 反对(0) 不知道风往哪儿吹 | 园豆:2035 (老鸟四级) | 2015-08-07 18:31

@不知道风往哪儿吹: 嗯,这个我就是按照您说的都已经封装到BLL中了,我现在不明白的地方就是用EF做数据查询的时候,如果返回的是var,我需要层层传递到BLL中,还得做类型转换。有没有一种方法针对这种多表多条件查询返回的结果,能统一去处理?

支持(0) 反对(0) 一伙豌豆 | 园豆:209 (菜鸟二级) | 2015-08-07 18:39

返回的类型你可以自己指定啊,你可以先转成list 在返回,或者其他的

支持(0) 反对(0) 不知道风往哪儿吹 | 园豆:2035 (老鸟四级) | 2015-08-07 18:47

@不知道风往哪儿吹: 类似这样的查询,那是不是我要先定义好需要返回的数据的这么一个实体?那这样的话,我岂不是以后有多种查询结果,就要定义多种实体。

支持(0) 反对(0) 一伙豌豆 | 园豆:209 (菜鸟二级) | 2015-08-07 21:12
0

既然用EF了,还是别这样写,不好,因为他是延时加载的,直接用主外键约束好点

收获园豆:1
稳稳的河 | 园豆:4216 (老鸟四级) | 2015-08-07 20:52

能不能说解释的详细点,怎么用主外键约束?多谢多谢

支持(0) 反对(0) 一伙豌豆 | 园豆:209 (菜鸟二级) | 2015-08-07 21:10
0

不要返回List<T>, 而是返回IQueryable<T>

这样的话可以利用延迟查询, 用返回结果继续拼接你的查询: IQueryable<T>.Join...

等使用的时候再转成List<T>都未迟

收获园豆:1
xiezhenhao | 园豆:100 (初学一级) | 2015-08-08 12:59

嗯,我也看了下,都推荐返回IQueryable<T>,那这个T我是我怎么去处理?是预先都定义好么?比如我有一个三个表做链接查询,但是A表B表C表我只需要其中有用的字段,那最后组成的这个结果,我是不是要预先定义好这个存放这个结果的实体。

支持(0) 反对(0) 一伙豌豆 | 园豆:209 (菜鸟二级) | 2015-08-10 14:09

@一伙豌豆: T是泛型,这是一种编程思想

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-08-11 16:30
0

这个问题一直困扰着我,至今没有好的解决方案,

Name="Jaly" | 园豆:202 (菜鸟二级) | 2016-11-27 08:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册