Я не совсем уверен, что заголовок правильно сформулирован, но вот ситуация ... Я заметил сегодня, когда пытался создать универсальную функцию сохранения для 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.
}
}