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();
    }