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

これは、lg List にあるものをvar test返します。my には、selectlistitem がまったく選択されていません。Lesgeversvar lesg

私の間違いはどこですか?:)どうすればthixを修正できますか?

4

1 に答える 1

1

NASDataContextこれは、Linq-to-SQLまたはLinq-to-Entitiesデータコンテキストであると思います。

var test選択では、lg.Contains(l)はlinq式の一部として評価されます。つまり、SQLに変換され、SQLサーバーで実行されます。これは、containsステートメントの同等性を判断するためにSQLサーバーに任されています。おそらくWHERE IN (...)、テーブルの主キーを使用して句に変換されLesgeverます。

ToSelectListメソッドでは、代わりにisSelected述語でオブジェクトの等価性を使用しています。リスト内のアイテムは、データコンテキストによって作成された新しいオブジェクトになります。リスト内のオブジェクトと同じエンティティに対応している場合でも、同じlgオブジェクトにはなりません。

m => lg.Contains(m)アイテムオブジェクト自体ではなく、アイテムのキーで比較するように述語を調整してみてください。IEquatable<T>または、インターフェイスを実装してisSelected、独自の等式定義を使用することもできます。

于 2010-03-18T09:24:50.813 に答える