我有一个实体框架模型,我有一个具有以下关系的用户:
User 1-* Test
每项测试都有以下关系:
Test 1-1 Course
Test 1-* TestEvent
我有一个返回用户的服务,在我的应用程序的不同点,我想急切地获取各种关系。我现在正在抓住所有的关系:
var result = (from appUser in context.AppUsers.Include("Tests.Course")
.Include("Tests.TestEvents")
where appUser.Login.ToLower() == loginName.ToLower() &&
appUser.IsDeleted == false
select appUser).FirstOrDefault();
我不想总是返回链接到Test或TestEvents的Course。如何构建ObjectQuery并根据需要动态添加Include语句,而不是使用一系列if else语句。
答案 0 :(得分:5)
好吧,既然Include
返回IQueryable<T>
(LINQ可链接),我会使用一个简单的扩展方法:
public static IQueryable<T> WithIncludes<T>(this IQueryable<T> source, string[] associations)
{
var query = (ObjectQuery<T>)source;
foreach (var assoc in associations)
{
query = query.Include(assoc);
}
}
然后您的查询如下所示:
var inclusions = new[] { "Tests.Course", "Tests.TestEvents" };
var result = ctx.AppUsers
.WithIncludes(inclusions)
.Where(x => x.Login.ToLower() == loginName.ToLower())
.Where(x => !x.IsDeleted)
.FirstOrDefault();
为了在include的魔术字符串中加入一些强类型,我有所有关联的专用枚举,所以我传递了一些[]并将枚举转换为字符串include。
问题是,您的方法应该定义所需的内含物。因此,您在方法中首先要做的是声明需要哪些关联,然后将其传递给您的扩展方法。
那是你的追求吗?