Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该始终使用导航属性还是使用.Where查询?_C#_Entity Framework_Database Design - Fatal编程技术网

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

C# 我应该始终使用导航属性还是使用.Where查询?,c#,entity-framework,database-design,C#,Entity Framework,Database Design,问题是哪种方法更好,还是根本不重要。那么,假设我有一个类项 公共类项目 { 公共int Id{get;set;} 公共字符串名称{get;set;} 公共虚拟ICollection类别{get;set;} } 以及引用的类别 公共类类别 { 公共int Id{get;set;} 公共字符串名称{get;set;} 公共虚拟ICollection项{get;set;} } 问题是,当用户单击某个类别时,该类别中的所有项目都应输出到列表中,该项目的类别也应如此 我可以用像这样的东西 \u con

问题是哪种方法更好,还是根本不重要。那么,假设我有一个类

公共类项目
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection类别{get;set;}
}
以及引用的类别

公共类类别
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection项{get;set;}
}
问题是,当用户单击某个类别时,该类别中的所有项目都应输出到列表中,该项目的类别也应如此

我可以用像这样的东西

\u context.Items.Where(c=>c.Category.Id==Id);
并删除虚拟成员。 我之所以问这个问题以及为什么我“想要”删除该成员,是因为当我使用WebApi为客户端获取Items表的Json数据时,它会输出如下内容:

{
“Id”:1,
“名称”:“字符串”,
“类别”:[
{
“Id”:1,
“名称”:“CName”,
“项目”:[]
}, 
{
“Id”:1,
“名称”:“CName”,
“项目”:[]
}
]
}
因此,为类别模型提供导航属性的唯一问题是,当我请求项目列表时,它还会向我发送此“项目”:[]。
这并没有影响到我或任何事情,所以我想知道我应该使用导航方法还是.Where方法。也许还有其他的方式我应该考虑?

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

也就是说。不要将EF对象用作数据协定。在最好的情况下,通过序列化程序运行一个将执行上面的操作,在常见情况下会导致循环引用异常


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

就我个人而言,我更喜欢使用查询和项目/Select中的导航属性来创建将被序列化的匿名类或自定义类。因此,我应该保留该属性,但创建另一个用于序列化的类?该类是否应该包含对该项的引用(这也是一个传输对象)?@E.Hoxha Yes。这正是典型的方法。项目将是另一个传输对象,它不会将nav属性返回到其父对象(以防止循环引用)。这里有一个不错的解读:当我执行POCO first EF时,我已经能够通过线路发送这些内容。但是,如果项目是非POCO first EF,那么我将按照您的建议创建DTO…,使其更具viewmodel风格。