【发布时间】:2014-05-10 04:02:07
【问题描述】:
我在 SQL Server 中使用 Entity Framework Code First,域实体与此类似:
public class Item
{
public ICollection<ItemLocation> ItemLocations { get; set; }
}
一个项目可以在其生命周期内分配到多个位置,但在任何时候只有一个处于活动状态,我们使用它来获取项目的实际位置:
public Location
{
get
{
return ItemLocations.Where(x => x.IsActive).Select(x => x.Location).FirstOrDefault()
}
}
如果我加载整个项目对象,此属性将按预期工作:
var item = (from i in db.Items select i).FirstOrDefault();
Console.WriteLine(item.Location.Name);
但是,我不能在需要返回匿名类型的 LINQ 查询中使用它,如下所示:
var items = from i in db.Items
select new
{
ItemId = i.ItemId,
LocationName = i.Location.Name
};
相反,我每次都必须使用完整的查询:
var items = from i in db.Items
select new
{
ItemId = i.ItemId,
LocationName = i.ItemLocations.Where(x => x.IsActive).Select(x => x.Location).FirstOrDefault().Name
};
理想情况下,我希望将检索项目位置的逻辑保留在一个地方(如属性),而不是将它们分散在各处。
实现这一目标的最佳方法是什么?
【问题讨论】:
-
我肯定对此感到困惑。我建议调试两个版本以确保
ItemLocations无论是直接访问还是通过Location属性访问都相同。不过,这可能是一个缓存问题... -
@Bobson 它无法按现状工作。在
Location属性中完成的查询已经编译成IL 代码。查询提供者不知道如何将其解析为 SQL 代码;它看到的只是一个Location属性,它没有映射到数据库列。
标签: c# linq entity-framework