Допустим, у меня есть следующий Linq2Entities запрос для некоторого метода обслуживания:Факторинговые из выражений в LINQ запросов
public IQueryable<CustomerProjection>()
{
return
from i in this.DbContext.Customers
select new CustomerProjection()
{
Reference = new EntityReference()
{
Id = i.Id,
Name = i.Name
}
}
}
Все мои модели объектов, в том числе клиентов, все поддерживают следующий интерфейс:
interface INamedEntity
{
String Name { get; set; }
Guid Id { get; set; }
}
так что в принципе у меня возникает соблазн провести рефакторинг:
public IQueryable<CustomerProjection>()
{
return
from i in this.DbContext.Customers
select new CustomerProjection()
{
// I want something something like this:
Reference = GetReference(i)
}
}
Очевидно, я не могу наивно определить GetRefe Renče таким образом:
public EntityReference GetReference<E>(E i)
where E : INamedEntity
{
return new EntityReference()
{
Id = i.Id,
Name = i.Name,
};
}
Что мне нужно вынесем логика создать выражение для запроса, а не как EntityReference непосредственно. Итак, давайте определим его таким образом:
public Expression<Func<INamedEntity, EntityReference>> GetReferenceExpression()
where E : INamedEntity
{
return i => new EntityReference()
{
Id = i.Id,
Name = i.Name,
};
}
Это правильно отводит логику. Тем не менее, я не могу использовать его в основном запросе:
public IQueryable<CustomerProjection>()
{
return
from i in this.DbContext.Customers
select new CustomerProjection()
{
// Something like "Invoke" doesn't exist!
Reference = GetReferenceExpression().Invoke(i)
}
}
мне нужно что-то вроде этого метода «Invoke» расширения поддерживаемых Linq2Entities, чтобы помочь мне на самом деле использовать мою преобразованную выход логику.
Обратите внимание, что это примерный сценарий со сниженной сложностью. Я понимаю, что факторинг в этом простом экземпляре действительно не нужен, но у меня были случаи более сложные, когда я хотел бы сделать что-то подобное.
Кроме того, есть второй, связанный сценарий, в котором не только хочет использовать преобразованная выход кода в более чем один запрос, но оценить его непосредственно:
GetReferenceExpression().Compile()(myEntity);
Это особенно интересно, если factored-out code является предикатом для фильтра.
Так что мой вопрос:
- Поддерживает ли Linq2Entities что-то вроде этого? Если да, то как?
- Есть ли другой провайдер linq независимый способ разложения выражений?
Я не понимаю ваше обновление. Вы можете по-прежнему фильтровать «правильные цели», где x.Entity.Property1 == value' – Aducci
@Aducci Я вернул обновление - я бы принял ответ, если он не подведет на меня работу.Я думаю, что вы подход, как правило, является хорошим решением для такого рода проблем, и я должен задать другой вопрос, если я хочу получить другой. – John
Примечание для меня и других: мне нужно проверить linqkit, linq для сущностей и linq для sql-хелперной библиотеки, которая, как представляется, предназначена для решения этой проблемы - у нее даже есть метод расширения, называемый «Invoke» для этой пусковой. – John