ToSelectList中的谓词问题

时间:2010-03-18 08:18:29

标签: 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 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?

1 个答案:

答案 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使用您自己的等式定义。