使用LINQ查詢或GetObjectKey檢索單個Entity Framework實體?

asp.net c# entity-framework linq

看起來GetObjectKey具有搜索現有的實例化對像以及數據存儲的好處。但是,它似乎也失去了一些強類型,並且需要轉換生成的對象:

GetObjectKey

int customerID = 1;
EntityKey key = new EntityKey("MyEntities.Customers", "CustomerID", customerID);
Customer customer = context.GetObjectByKey(key) as Customer;

與LINQ

int customerID = 1;
Customer customer = (from c in context.Customers 
                     where c.CustomerID = customerID
                     select c).FirstOrDefault();

就個人而言,由於打字,我更喜歡後一種方法。此外,您的DAL將相當統一,所有Get方法都是查詢,儘管這只是個人偏好。

你們男孩和女孩用的是什麼?

一般承認的答案

我更喜歡後者,因為它明確清楚你想要什麼。通過使用EntityKey(這是ADO.NET團隊似乎無法理解的東西),我們必須解決Entity Framework強加給我們的結構。通過在第二個示例中使用查詢語言,我們告訴所有其他開發人員,他們將查看我們的代碼,嘿,我們只是希望這個對象具有此ID或我們想要null。

我不認為這是正確的(正如你在第一個例子中所說的那樣)是一個不向同事說清楚的藉口。 :)


熱門答案

在我的解決方案中,我使用泛型編程。在基礎Repository類中,我有這樣的代碼:

private string GetEnittySetName(string entityTypeName)
{
    var container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace);
    string entitySetName = (from meta in container.BaseEntitySets
                            where meta.ElementType.Name == entityTypeName
                            select meta.Name).FirstOrDefault();
    return entitySetName;
}

private string entitySetName;

protected string EntitySetName
{
    get
    {
        if (string.IsNullOrEmpty(entitySetName))
        {
            entitySetName = GetEnittySetName(typeof(T).Name);
        }
        return entitySetName;
    }
}

public T SelectOne(Func<T, bool> exp)
{
    return context.CreateQuery<T>(EntitySetName).Where(exp).FirstOrDefault();
}


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