我有一个名为“CodeLookupAccessDataContext”的 DataContext 对象,它是通过 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(),并且特别有兴趣保持它能够接受 lambda 函数来指定要返回的行/列。
UPDATE
这次讨论 https://stackoverflow.com/questions/2783767/linq-based-generic-alternate-to-predicatet可能也会感兴趣。