我不完全确定标题的措辞是否正确,但是情况就是这样......我今天注意到在尝试为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. } }
答案 0 :(得分:1)
这实际上不是一个lambda问题。这里的非查询语法也可以使用:
var row1 = table.Where(o => o.ID == data.ID)
.SingleOrDefault();
基本上编译成与查询表达式相同的代码。
我强烈怀疑它是SingleOrDefault
(内部)的不同代码路径,它会产生问题。