首页 新闻 会员 周边

EF 我想用泛型代替实体类型去查询实体,如何关联查询(Include)?

0
悬赏园豆:20 [已解决问题] 解决于 2020-05-13 11:20

public class ModelHelper<M, E> where M : Model where E : Entity
{
public List<M> GetAll()
{
using (MyDBContext myDBContext = new MyDBContext())
{
myDBContext.Set<E>().Load();
var eList = myDBContext.Set<E>().Local;
if (eList != null && eList.Count > 0)
{
return eList.ToList().Select(t => ModelExtension<E, M>.GetModel(t)).ToList();
}
return new List<M>();
}
}
}

E是实体类型,M是模型类型这个不用管

myDBContext.Set<E>().Load();发现这种写法查到的E其他表都是空的,由于是泛型我如何include呢?

请各位大神不吝赐教

猝不及防的主页 猝不及防 | 老鸟四级 | 园豆:2781
提问于:2020-05-12 18:00
< >
分享
最佳答案
0
public IQueryable<T> FindList(Expression<Func<T, bool>> predicate, bool isTrack,  params Expression<Func<T, dynamic>>[] expressions)
        {
            IQueryable<T> qt = _efcontext.set<T>();
            if (expressions != null && expressions.Any())
                foreach (var exp in expressions)
                    qt = qt.Include(exp);
            if (!isTrack) qt = qt.AsNoTracking();
            if (predicate != null) qt = qt.Where(predicate);
            return qt;
        }
收获园豆:10
happydaily | 菜鸟二级 |园豆:301 | 2020-05-13 08:03

看了您二位的回答我明白了,我被自己限制住了。
我昨天提问的时候是这么想的:
我都用泛型了,就不想自己手动加载他的外键表了,我想要的是可以不可以不写include让他自己去加载外键表。
现在我想明白了,我定义这个类型的时候他到底是什么实体类型我已经穿进去了,确定了,我又何必去追求加载哪些表什么也不写。

但是可以不可以什么表也不传进去就让他自己默认加载所有的关联表吗

猝不及防 | 园豆:2781 (老鸟四级) | 2020-05-13 09:22

感觉写法很nb啊

猝不及防 | 园豆:2781 (老鸟四级) | 2020-05-13 09:41

@猝不及防: 不要让EF主动帮你加载,事实上定义的导航(关联),也不是每次查询都要加载,那样会引发性能问题,所以用Include要主动告诉EF来加载哪些导航,示例是我自己写的通用EF查询封装。

happydaily | 园豆:301 (菜鸟二级) | 2020-05-13 09:59

@happydaily: 大佬关注了,您是哪个城市的,加个好友啊

猝不及防 | 园豆:2781 (老鸟四级) | 2020-05-13 10:06
其他回答(1)
0

可以这样写。
var result = _dbContext.Set<T>().Include("Department");

收获园豆:10
爱编程的大叔 | 园豆:30839 (高人七级) | 2020-05-12 19:43

看了您二位的回答我明白了,我被自己限制住了。
我昨天提问的时候是这么想的:
我都用泛型了,就不想自己手动加载他的外键表了,我想要的是可以不可以不写include让他自己去加载外键表。
现在我想明白了,我定义这个类型的时候他到底是什么实体类型我已经穿进去了,确定了,我又何必去追求加载哪些表什么也不写。

但是可以不可以什么表也不传进去就让他自己默认加载所有的关联表吗

支持(0) 反对(0) 猝不及防 | 园豆:2781 (老鸟四级) | 2020-05-13 09:22

@猝不及防:
Include 佳兵者不详之器,圣人不得已而用之。
除了在DEMO的时候不需要考虑性能,或者是非常小的应用,
否则 Include 能不用则不用之。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2020-05-13 10:20

@爱编程的大叔: 受教了大叔!

支持(0) 反对(0) 猝不及防 | 园豆:2781 (老鸟四级) | 2020-05-13 11:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册