对数据循环使用lambda和接口的泛型函数约束时出现NotSupportedException

时间:2009-10-23 19:14:47

标签: linq generics delegates lambda interface

我不完全确定标题的措辞是否正确,但是情况就是这样......我今天注意到在尝试为Linq to Sql创建一个通用保存函数时,我在对数据上下文选择时使用lambda。它在具有另一个通用接口的类型约束的泛型函数内中断。但是,它与LINQ语法一起工作正常。我或多或少地提出这个问题,以便了解为什么会发生这种情况。

抛出的异常是:
NotSupportedException异常
不支持接口成员IEntity`1.ID的映射。

所涉及的代码与此类似(简化):
导致错误的功能是GenericFunc< T>


//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 个答案:

答案 0 :(得分:1)

这实际上不是一个lambda问题。这里的非查询语法也可以使用:

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

基本上编译成与查询表达式相同的代码。

我强烈怀疑它是SingleOrDefault(内部)的不同代码路径,它会产生问题。