NotSupportedException при использовании лямбда-выражения с DataContext и ограничением универсальной функции интерфейса - PullRequest
0 голосов
/ 23 октября 2009

Я не совсем уверен, что заголовок правильно сформулирован, но вот ситуация ... Я заметил сегодня, когда пытался создать универсальную функцию сохранения для Linq to Sql, которую при использовании лямбда-выражения в контексте данных выбирают.Он разрывается в универсальной функции с ограничением типа другого универсального интерфейса.Тем не менее, он прекрасно работает с синтаксисом LINQ.Я задаю этот вопрос более или менее, чтобы понять, почему это происходит.

Выдается исключение:
NotSupportedException
Сопоставление элемента интерфейса IEntity`1.ID не поддерживается.

Код выглядит примерно такна это (упрощенно):
Функция, вызывающая ошибку: GenericFunc


//Assume SomeTable is generated from a DBML L2S file.

//partial extension of the L2S class
public partial class SomeTable : IEntity<SomeTable> { }

//interface to expose shared properties in these entity classes
public interface IEntity<T> where T : class
{
    //isolated application, int Primary key for all these tables.
    int ID { get; set; } 
}

//simple helper class for L2S stuff.
public class Repository
{
    //helper for inserting/updating data..
    public void SaveSomeTable(SomeTable data)
    {
        SomeDataContext db = new SomeDataContext();
        GenericFunc<SomeTable>(db.SomeTables, data);
    }

    //toy function for this example
    public void GenericFunc<T>(System.Data.Linq.Table<T> table, T data) where T : class, IEntity<T>, new ()
    {
        //note the generic type constraints... 
        //in this case, all table entities conform to the IEntity<T> class.

        //breaks
        var row = table.SingleOrDefault(o => o.ID == data.ID); 

        //works
        var row1 = (from item in table where item.ID == data.ID select item).SingleOrDefault();

        //... more stuff.
    }
}

1 Ответ

1 голос
/ 23 октября 2009

Это не совсем лямбда-проблема. Вот синтаксис без запроса, который тоже будет работать:

var row1 = table.Where(o => o.ID == data.ID)
                .SingleOrDefault();

Это компилируется в тот же код, что и выражение запроса, в основном.

Я сильно подозреваю, что это другой путь кода для SingleOrDefault (внутренне), который вызывает проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...