gpt4 book ai didi

c# - 选择中的 Entity Framework 条件

转载 作者:行者123 更新时间:2023-11-30 22:01:26 26 4
gpt4 key购买 nike

我有以下数据库代码:

static IEnumerable<dynamic> GetData(bool withchildren) {
using (var model = new testEntities()) {
var res = default(IQueryable<dynamic>);
if (withchildren) {
res = model.UserSet
.Where(u => u.name != "")
.Select(u => new {
Name = u.name,
Email = u.email,
Groups = u.GroupSet.Select(g => new {
Name = g.name,
Id = g.Id
})
});
} else {
res = model.UserSet
.Where(u => u.name != "")
.Select(u => new {
Name = u.name,
Email = u.email
});
}
return res.ToList()
}
}

我想缩减代码,这样写:

static IEnumerable<dynamic> GetData(bool withchildren) {
using (var model = new testEntities()) {
var res = default(IQueryable<dynamic>);
res = model.UserSet
.Where(u => u.name != "")
.Select(u => {
dynamic item = new {
Name = u.name,
Email = u.email
};
if(withchildren) {
item.Groups = u.GroupSet.Select(g => new {
Name = g.name,
Id = g.Id
});
}
return item;
});
return res.ToList();
}
}

但 Visual Studio 提示说它无法将 lambda 表达式转换为表达式树。

我的问题是,有没有一种方法可以通过 Entity Framework 和 Linq 来实现?我真的不想直接使用 ADO.net。

也许有比我想象的代码更好的版本来缩小它。

Here是与 Linq-To-Objects 相关的问题。

编辑

在有人问之前,我在示例代码中使用了 dynamic 以使其更容易和更快。

编辑 2

我使用这种方法的目标是只查询我需要提高性能的字段。检查http://www.progware.org/Blog/post/Slow-Performance-Is-it-the-Entity-Framework-or-you.aspx .

目前我们使用类似的东西

static IEnumerable<dynamic> GetData(bool withchildren) {
using (var model = new testEntities()) {
var res = default(IQueryable<dynamic>);
res = model.UserSet
.Where(u => u.name != "")
.ToList();
return res;
}
}

根据 Glimpse 的说法,性能非常糟糕。

编辑 3

简短的旁注,我编写了一些快速而肮脏的代码。也就是说,为什么不需要最后的 foreach 。实际代码目前不可用。

最佳答案

有什么原因你不能使用:

res = model.UserSet
.Where(u => u.name != "")
.Select(u => new {
Name = u.name,
Email = u.email,
Groups = withchildren
? u.GroupSet.Select(g => new {
Name = g.name,
Id = g.Id
})
: null;
})
};

或者也许:

res = model.UserSet
.Where(u => u.name != "")
.ToList() // ToList() here to enumerate the items
.Select(u => {
dynamic item = new {
Name = u.name,
Email = u.email
};
if(withchildren) {
item.Groups = u.GroupSet.Select(g => new {
Name = g.name,
Id = g.Id
});
}
return item;
});

一种可以让您消除一些代码的方法是:

var res = model.UserSet.Where(u => u.name != "");
if (withchildren) {
res = res.Select(u => new {
Name = u.name,
Email = u.email,
Groups = u.GroupSet.Select(g => new {
Name = g.name,
Id = g.Id
})
});
} else {
res = res.Select(u => new {
Name = u.name,
Email = u.email
});
}

关于c# - 选择中的 Entity Framework 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27707235/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com