Предикатная проблема в ToSelectList - PullRequest
1 голос
/ 18 марта 2010

метод 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, выделенного вообще.

где моя ошибка? :) как мне починить тикс?

1 Ответ

1 голос
/ 18 марта 2010

Я предполагаю, что NASDataContext - это контекст данных Linq-to-SQL или Linq-to-Entities.

В выборе var test значение lg.Contains(l) оценивается как часть выражений linq, что означает, что оно будет преобразовано в SQL и выполнено на сервере SQL. Это оставляет серверу SQL определять равенство для оператора содержимого. Вероятно, он будет преобразован в предложение WHERE IN (...) с использованием первичного ключа таблицы Lesgever.

В вашем методе ToSelectList вы вместо этого используете равенство объектов в предикате isSelected. Элементы в списке будут новыми объектами, созданными контекстом данных. Даже если они соответствуют той же сущности, что и объекты в списке lg, они не будут такими же объектами.

Попробуйте настроить свой предикат m => lg.Contains(m) для сравнения по ключам элемента, а не по самому объекту элемента. В качестве альтернативы вы можете реализовать интерфейс IEquatable<T>, чтобы isSelected использовал ваше собственное определение равенства.

...