Получить отдельные сущности Entity Framework, используя запрос LINQ или GetObjectKey? - PullRequest
8 голосов
/ 26 июня 2009

Похоже, что 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 являются запросами, хотя это всего лишь личное предпочтение.

Что вы, мальчики и девочки, используете?

Ответы [ 2 ]

9 голосов
/ 26 июня 2009

Я предпочитаю последнее, потому что ясно ясно, что вы хотите. Используя EntityKey (а это то, что команда ADO.NET, похоже, не понимает), мы должны обойти структуру, навязанную нам Entity Framework. Используя язык запросов так, как вы это делали во втором примере, мы сообщаем всем остальным разработчикам, которые когда-либо будут смотреть на наш код, эй, мы просто хотим этот объект с этим идентификатором или мы хотим иметь значение null.

Я не думаю, что правильность (как и в первом примере) является оправданием для того, чтобы не быть понятными своим коллегам. :)

1 голос
/ 13 мая 2010

В моем решении я использую общее программирование. В базовом классе репозитория у меня есть такой код:

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...