我在网上查看了许多资源,但我认为这是不可能的,或者我是从错误的角度进行研究的。
我正在从子表中生成ID列表,并确定父表中的外键ID是否包含在子ID列表中。例如j =>!ids.Contains(j.InvestorId)。下面的代码将不会编译,因为whereFilter无法接受参数,但是您可以看到我想要的效果。
希望有一种方法可以代替预先获取ID并将附加参数传递给whereFilter。
public List<int> ValidateReferentialIntegrity<TChild, TParent>(string childFilePath,
string parentFilePath,
Func<TParent, int, bool> whereFilter,
Func<TParent, int> selector)
{
var childList = ReadCsvFile<TChild>(typeof(TChild).Name, childFilePath);
var parentList = ReadCsvFile<TParent>(typeof(TParent).Name, parentFilePath);
var ids = childList.Select(s => (int)s.GetId()).ToList();
var unidentifiableIds = parentList.Where(whereFilter(ids))
.Select(selector).ToList();
return unidentifiableIds;
}
答案 0 :(得分:1)
public List<int> ValidateReferentialIntegrity<TChild, TParent>(string childFilePath,
string parentFilePath,
Func<TParent, IList<int>, bool> whereFilter, // <- change #1 is here, IList<int>
Func<TParent, int> selector)
{
var childList = ReadCsvFile<TChild>(typeof(TChild).Name, childFilePath);
var parentList = ReadCsvFile<TParent>(typeof(TParent).Name, parentFilePath);
var ids = childList.Select(s => (int)s.GetId()).ToList();
var unidentifiableIds = parentList
.Where(p => whereFilter(p, ids)) // <- change #2 is here, pass object to whereFilter
.Select(selector)
.ToList();
return unidentifiableIds;
}
并这样称呼它:
var list = ValidateReferentialIntegrity<TChild, TParent>(
"file1.csv",
"file2.csv",
(TParent parent, IList<int> childIds) => childIds.Contains(parent.InvestorId),
parent => parent.InvestorId);