【发布时间】:2018-10-13 05:10:01
【问题描述】:
我有一个如下所示的 EF 类:
public class Item
public string ItemId{ get; set; }
public string NormalDescription { get; set; }
public string LongDescription { get; set; }
public string ShortDescription { get; set; }
.. <snip>
另外,我有一个如下所示的 DTO:
public class ItemDTO
public string Id { get; set; }
public string DisplayName { get; set; }
.. <snip>
将“Item”类中的数据加载到 DTO 后,我需要根据配置设置有条件地设置“DisplayName”。换句话说,我正在寻找类似于:
return _repo.GetAsQueryable<Item>()
.Select(i=> new ItemDTO
{
Id = i.ItemId,
DisplayName = (setting == 1) ? i.NormalDescription :
(setting == 2) ? i.LongDescription :
(setting == 3) ? i.ShortDescription :
String.Empty
}
当然,这会导致一些非常低效的 SQL(使用“CASE”来评估每个可能的值)被发送到数据库。这是一个性能问题,因为项目上有大量的描述字段。
话虽如此,有没有办法只选择填充“DisplayName”值所需的字段?
换句话说,我只想根据我的应用程序配置设置检索一个描述值,而不是填充“CASE WHEN”逻辑的查询。
【问题讨论】:
-
它只会得到现在的 Id 和 DisplayName。有什么问题?
-
@CodingYoshi 是的,它填充了 Id 和 DisplayName,但是它使用了非常低效的 SQL。换句话说,它使用大量的“CASE WHEN”逻辑来查询数据库。我希望有一种确定的方式来填充 LINQ 选择投影..
-
case when非常有效。你的绩效目标是什么?您是否进行了基准测试? -
您的选择是案例语句或查询所有列并在内存中进行映射或为每个案例单独查询。
-
一个更彻底的改变是重组您的数据库表,使其具有一个描述表,该表具有项目表的外键以及描述名称和类型。然后您的设置可以与类型匹配。
标签: c# sql entity-framework linq linq-to-entities