我应该始终使用导航属性还是使用.Where查询?

时间:2017-04-05 18:39:48

标签: c# entity-framework database-design

这个问题是,哪种方法更好,或者它是否微不足道。所以,比方说我有一个类

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Category> Categories { get; set; }
}

和引用的类别

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Item> Items { get; set; }
}

问题在于,当用户点击某个类别时,该类别中的所有项目都应该在列表中输出,因此应该对该项目的类别进行输出。

我可以使用像

这样的东西
_context.Items.Where(c => c.Category.Id == id);

并删除虚拟成员。 我问这个以及为什么我“想要”删除该成员的原因是因为当我使用WebApi为客户端获取Items表的Json数据时,它会输出如下内容:

{
    "Id": 1,
    "Name": "String",
    "Category": [
        {
        "Id": 1,
        "Name": "CName",
        "Items": []
        }, 
        {
        "Id": 1,
        "Name": "CName",
        "Items": []
        }
    ]
}

因此,具有类别模型的导航属性的唯一问题是,当我请求项目列表时,它还会向我发送此“项目”:[]。 它不像它影响我或任何东西,所以我想知道我是否应该使用导航方法或.Where方法。或者也许还有其他一些我应该考虑的方式?

1 个答案:

答案 0 :(得分:3)

始终使用导航属性。 EF将能够生成比您更有效的查询(可能至少)。它也很多更容易阅读。

那就是说。 使用您的EF对象作为数据合同。通过序列化程序运行一个将在 best 情况下执行上面的操作,并且在常见情况下会导致循环引用异常。

您的合同应单独定义,以便不存在循环引用。使用Select将数据库类型的集合转换为API类型。