У меня есть объект DataContext, называемый «CodeLookupAccessDataContext», который был создан с помощью мастера классов Visual Studio LINQ to SQL. Я расширил функциональность этого объекта так, что он предоставляет некоторые методы для возврата результатов запросов LINQ to SQL. Вот методы, которые я определил:
public List<CompositeSIDMap> lookupCompositeSIDMap(int regionId, int marketId)
{
var sidGroupId = CompositeSIDGroupMaps.Where(x => x.RegionID.Equals(regionId) && x.MarketID.Equals(marketId))
.Select(x => x.CompositeSIDGroup);
IEnumerator<int> sidGroupIdEnum = sidGroupId.GetEnumerator();
if (sidGroupIdEnum.MoveNext())
return lookupCodeInfo<CompositeSIDMap, CompositeSIDMap>(x => x.CompositeSIDGroup.Equals(sidGroupIdEnum.Current), x => x);
else
return null;
}
private List<TResult> lookupCodeInfo<T, TResult>(Func<T, bool> compLambda, Func<T, TResult> selectLambda)
where T : class
{
System.Data.Linq.Table<T> dataTable = this.GetTable<T>();
var codeQueryResult = dataTable.Where(compLambda)
.Select(selectLambda);
List<TResult> codeList = new List<TResult>();
foreach (TResult row in codeQueryResult)
codeList.Add(row);
return codeList;
}
CompositeSIDGroupMap и CompositeSIDMap - это обе таблицы в нашей базе данных, которые представлены как объекты в моем объекте DataContext. Я написал следующий код для вызова этих методов и отображения T-SQL, сгенерированного после вызова этих методов:
using (CodeLookupAccessDataContext codeLookup = new CodeLookupAccessDataContext())
{
codeLookup.Log = Console.Out;
List<CompositeSIDMap> compList = codeLookup.lookupCompositeSIDMap(regionId, marketId);
}
Я получил следующие результаты в своем журнале после вызова этого кода:
SELECT [t0].[CompositeSIDGroup]
FROM [dbo].[CompositeSIDGroupMap] AS [t0]
WHERE ([t0].[RegionID] = @p0) AND ([t0].[MarketID] = @p1)
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [5]
-- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [3]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1
SELECT [t0].[PK_CSM], [t0].[CompositeSIDGroup], [t0].[InputSID], [t0].[TargetSID], [t0].[StartOffset], [t0].[EndOffset], [t0].[Scale]
FROM [dbo].[CompositeSIDMap] AS [t0]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1
Первый оператор T-SQL содержит предложение where, как указано, и возвращает один столбец, как и ожидалось. Однако во втором операторе отсутствует предложение where, и он возвращает все столбцы, хотя я и указал, какие строки я хотел бы просмотреть и какие столбцы представляли интерес. Почему второй оператор T-SQL сгенерирован таким, какой он есть, и что я должен сделать, чтобы обеспечить фильтрацию данных в соответствии со спецификациями через T-SQL?
Также обратите внимание, что я бы предпочел оставить lookupCodeInfo () и особенно заинтересован в том, чтобы он был включен, чтобы принимать лямбда-функции для указания, какие строки / столбцы возвращать.
UPDATE
Это обсуждение также может представлять интерес.