在LINQ to Entities中初始化強類型對象

entity-framework linq linq-to-entities strong-typing

我有一個普通的舊CLR對象,它本質上是兩個實體框架對象的包裝器,我這樣做,所以我可以將這個包裝器對像傳遞給MVC框架中的強類型視圖。我的foo包裝類非常簡單:

public class FooWrapper
{
    public FooWrapper(Foo f, Bar b)
    {
        this.FooObject = f;
        this.BarObject = b;
    }

    public Foo FooObject { get; private set; }
    public Bar BarObject { get; private set; }
}

到目前為止,我的ListFoosWithBars函數具有以下內容:

public IEnumerable<FooWrapper> ListFoosWithBars(int userID)
{
    IEnumerable<Bar> tempBar = ListBarsByUserID(userID);
    IEnumerable<FooWrapper> results = (from f in _entities.FooSet
                                       join b in tempBar on f.ID equals b.foos.ID
                                       select new FooWrapper(f, b));
    return results;
}

這不起作用,因為顯然LINQ to Entities不支持參數化初始化,拋出的異常只是說:“LINQ to Entities中只支持無參數構造函數和初始值設定項。”我想知道是否有另一種方法來實現同樣的結果?

一般承認的答案

如果您向FooWrapper添加無參數構造函數,然後使用對像初始化,如下所示:

public IEnumerable<FooWrapper> ListFoosWithBars(int userID)
{
    IEnumerable<Bar> tempBar = ListBarsByUserID(userID);

    IEnumerable<FooWrapper> results = (
        from f in _entities.FooSet
        join b in tempBar on f.ID equals b.foos.ID
        select new FooWrapper()
        {
            FooObject = f, 
            BarObject = b
        });

    return results;
}

熱門答案

好的,但是如果你想讓FooObject和BarObject只讀取呢?對我來說似乎有點倒退,他們否定了在對像上使用構造函數的能力。

我可以看到很多人破壞了良好的封裝實踐,以便在這種情況下利用對像初始化。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因