1

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确实返回了我Lesgevers在 lg 列表中的那个,在我的 中var lesg,根本没有选择 selectlistitem。

我的错误在哪里?:) 我该如何解决这个问题?

4

1 回答 1

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

于 2010-03-18T09:24:50.813 回答