Это - то, что я делаю.
SELECT FullName
FROM
(
SELECT LastName + ', ' + FirstName AS FullName
FROM customers
) as sub
GROUP BY FullName
<час> Эта техника применяется простым способом к Вашему сценарию "редактирования":
SELECT FullName
FROM
(
SELECT
CASE
WHEN LastName IS NULL THEN FirstName
WHEN LastName IS NOT NULL THEN LastName + ', ' + FirstName
END AS FullName
FROM customers
) as sub
GROUP BY FullName
[Заявление об ограничении ответственности - я работаю в Typemock]
Рассматривали ли вы использование фреймворка для фиксации?
Вы можете использовать Typemock Isolator для создания поддельного экземпляра DataServiceQuery:
var fake = Isolate.Fake.Instance<DataServiceQuery>();
И вы можете создать аналогичный поддельный DataServiceContext и настроить его поведение вместо того, чтобы пытаться наследовать его.
Я решил эту проблему, создав интерфейс IDataServiceQuery
с двумя реализациями:
DataServiceQueryWrapper
MockDataServiceQuery
Затем я использую IDataServiceQuery
везде, где я раньше использовал бы DataServiceQuery
.
public interface IDataServiceQuery<TElement> : IQueryable<TElement>, IEnumerable<TElement>, IQueryable, IEnumerable
{
IDataServiceQuery<TElement> Expand(string path);
IDataServiceQuery<TElement> IncludeTotalCount();
IDataServiceQuery<TElement> AddQueryOption(string name, object value);
}
DataServiceQueryWrapper
принимает в своем конструкторе DataServiceQuery
, а затем делегирует все функции переданному запросу. Аналогично, MockDataServiceQuery
принимает IQueryable
и делегирует все возможное запросу.
Что касается имитационных методов IDataServiceQuery
, я в настоящее время просто возвращаю this
, хотя вы можете сделать что-то для имитации функциональности, если хотите.
Например:
// (in DataServiceQueryWrapper.cs)
public IDataServiceQuery<TElement> Expand(string path)
{
return new DataServiceQueryWrapper<TElement>(_query.Expand(path));
}
// (in MockDataServiceQuery.cs)
public IDataServiceQuery<TElement> Expand(string path)
{
return this;
}