Вопрос по linq, entity-framework, c#, asp.net – Получить отдельные сущности Entity Framework, используя запрос LINQ или GetObjectKey?

8

Похоже, что GetObjectKey обладает преимуществом поиска существующих, созданных экземпляров объектов и, затем, хранилища данных. Тем не менее, также кажется, что вы потеряли некоторую строгую типизацию, и вам нужно разыграть полученный объект:

GetObjectKey

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

vs. LINQ

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

Лично я предпочитаю последний метод из-за набора текста. Кроме того, ваш DAL будет довольно единообразным, так как все методы Get являются запросами, хотя это всего лишь личное предпочтение.

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

Хорошая точка зрения. Я изменю пример, чтобы сравнять счет немного. John Bubriski♦
В первом методе я бы использовал ключевое слово «as» вместо приведения. Таким образом, если результат равен нулю, он не выдаст исключение. Ключевое слово as пытается привести значение, но если оно не правильного типа, вместо него вы получите нулевое значение. Таким образом, у вас будет context.GetObjectByKey (key) в качестве Customer;. Doctor Jones

Ваш Ответ

2   ответа
9

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

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

1

позитория у меня есть такой код:

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();
}

Похожие вопросы