考虑下课

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,无论它是属性还是方法。

08-27 00:28