Linq ToSelectList中的谓词问题
Linq ToSelectList中的谓词问题,linq,linq-to-sql,predicate,Linq,Linq To Sql,Predicate,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 Lis
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;
}
var测试
会返回lg列表中的Lesgevers
,在我的var lesg
中,根本没有选择selectlistitem
我的错在哪里?:)如何修复thix?我假设
NASDataContext
是一个Linq-to-SQL或Linq-to-Entities数据上下文
在var测试
选择中,lg.Contains(l)
作为linq表达式的一部分进行计算,这意味着它将被转换为SQL并在SQL server上执行。这就让SQL server来确定contains语句的相等性。它可能会使用Lesgever
表的主键转换为WHERE IN(…)
子句
在ToSelectList
方法中,在isSelected
谓词中使用对象相等。列表中的项目将是由数据上下文创建的新对象。即使它们与列表lg
中的对象对应同一实体,它们也不会是相同的对象
尝试调整谓词
m=>lg.Contains(m)
以比较项的键,而不是项对象本身。或者,您可以实现IEquatable
接口,使isSelected
使用您自己的相等定义。我假设NASDataContext
是Linq to SQL或Linq to Entities数据上下文
在var测试
选择中,lg.Contains(l)
作为linq表达式的一部分进行计算,这意味着它将被转换为SQL并在SQL server上执行。这就让SQL server来确定contains语句的相等性。它可能会使用Lesgever
表的主键转换为WHERE IN(…)
子句
在ToSelectList
方法中,在isSelected
谓词中使用对象相等。列表中的项目将是由数据上下文创建的新对象。即使它们与列表lg
中的对象对应同一实体,它们也不会是相同的对象
尝试调整谓词m=>lg.Contains(m)
以比较项的键,而不是项对象本身。或者,您可以实现IEquatable
接口,使isSelected
使用您自己的相等定义。如果我使用键(int),那么它确实可以按预期工作。谢谢,如果我使用了键(int),那么它就可以按预期工作了。谢谢
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();
}
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();
}