考虑下课
public class AccountGroup : Entity<int>
{
public AccountGroup()
{
Accounts = new HashSet<Account>();
Groups = new HashSet<AccountGroup>();
}
// option 1 - read only properties
public bool IsRoot { get { return Parent == null; } }
public bool IsLeaf { get { return !Groups.Any(); } }
public Account MainAccount { get { return Accounts.FirstOrDefault(a=>a.Type == AccountType.MainAccount); } }
// option 2 - parameter-less methods
//public bool IsRoot() { return Parent == null; }
//public bool IsLeaf() { return !Groups.Any(); }
//public Account GetMainAccount() { return Accounts.FirstOrDefault(a => a.Type == AccountType.MainAccount); }
public string Name { get; set; }
public string Description { get; set; }
public virtual ISet<Account> Accounts { get; private set; }
public virtual ISet<AccountGroup> Groups { get; private set; }
public virtual AccountGroup Parent { get; set; }
}
如果要“丰富”上面的类,则应使用哪种选择方法。
选项1
我应该在知道EF不喜欢它们的情况下使用只读参数吗(尝试在Where子句中使用IsRoot引发EX,使用
The specified type member 'IsRoot' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
选项2
还是我应该使用无参数方法(不确定会有什么缺点)
一般而言(不考虑EF),在功能等效时(例如,如果我调用
.IsRoot
或.IsRoot()
时,我将获得相同的功能),则首选上述方法 最佳答案
IsRoot
对我来说更像是一种财产。它表示对象的当前状态,在调用时除了报告该状态外实际上不执行任何操作,通常.NET中的getter / setter是属性。
还需要考虑其他事项,JSON / XML序列化程序不会序列化IsRoot()
,但会将IsRoot
作为属性。一般来说,.NET中的许多内容取决于属性,因此通常是更好的选择。
EF也不想使用IsRoot()
,只是不知道如何将IsRoot转换为SQL,无论它是属性还是方法。