我拥有的ToSelectList
方法:
public static IList<SelectListItem> ToSelectList<T>(this IEnumerable<T> itemsToMap, Func<T, string> textProperty, Func<T, string> valueProperty, Predicate<T> isSelected)
{
var result = new List<SelectListItem>();
foreach (var item in itemsToMap)
{
result.Add(new SelectListItem
{
Value = valueProperty(item),
Text = textProperty(item),
Selected = isSelected(item)
});
}
return result;
}
当我在这里调用此方法时:
public static List<SelectListItem> lesgeverList(int selectedID) {
NASDataContext _db = new NASDataContext();
var lesg = (from l in _db.Lesgevers
where l.LG_Naam != "leeg"
orderby l.LG_Naam
select l).ToSelectList(m => m.LG_Naam + " " + m.LG_Vnaam, m => m.LG_ID.ToString(), m => m.LG_ID == selectedID);
return lesg.ToList();
}
我得到的List<SelectListItem>
已选中selectedID
。
现在,当我想要多个选定的项目时,我会给出一个Lesgevers列表
public static List<SelectListItem> lesgeverList(List<Lesgever> lg) {
NASDataContext _db = new NASDataContext();
var test = (from l in _db.Lesgevers
where l.LG_Naam != "leeg" && lg.Contains(l)
orderby l.LG_Naam, l.LG_Vnaam
select l).ToList();
var lesg = (from l in _db.Lesgevers
where l.LG_Naam != "leeg"
orderby l.LG_Naam, l.LG_Vnaam
select l).ToSelectList(m => m.LG_Naam + " " + m.LG_Vnaam, m => m.LG_ID.ToString(), m => lg.Contains(m));
return lesg.ToList();
}
var test
确实返回了lg列表中的Lesgevers
,在我的var lesg
中,根本没有选择任何选择列表项。
我的错误在哪里? :)我该如何修复thix?
答案 0 :(得分:1)
我假设NASDataContext
是Linq-to-SQL或Linq-to-Entities数据上下文。
在var test
选择中,lg.Contains(l)
被评估为linq表达式的一部分,这意味着它将被转换为SQL并在SQL服务器上执行。这使得SQL服务器可以确定contains语句的相等性。它可能会使用WHERE IN (...)
表的主键转换为Lesgever
子句。
在ToSelectList
方法中,您使用isSelected
谓词中的对象相等。列表中的项目将是由数据上下文创建的新目标。即使它们与列表lg
中的对象对应于同一实体,它们也不会是相同的对象。
尝试调整谓词m => lg.Contains(m)
以比较项目的键,而不是项目对象本身。或者,您可以实现IEquatable<T>
接口以使isSelected
使用您自己的等式定义。