[英]Strange exception in Linq-to-SQL
我开发了扩展方法:
public static IQueryable<T> Get<T>(this DataContext dataContext) where T : class
{
return dataContext.GetTable<T>();
}
然后我尝试使用它:
dataContext.Get<XDbCurrency>().
Where(c => c.Id == XCurrencyId.USD).
SelectMany(
c =>
dataContext.Get<XDbCurrencyRate>().
Where(cr =>
cr.CurrencyId == c.Id &&
cr.StartOn <= DateTime.UtcNow &&
cr.EndOn > DateTime.UtcNow).
Take(1),
(c, cr) => cr).
ToArray();
我Member access 'XCurrencyId CurrencyId' of 'X.XDbCurrencyRate' not legal on type 'System.Data.Linq.Table``1[X.XDbCurrencyRate].
当我改变Get
回GetTable
-一切正常! 当我将Get
的返回类型从IQueryable<T>
更改为Table<T>
,它会崩溃。
UPDATE。 我创建了XDataContextBase
类,将Get
方法移到那里, XDataContext
从XDataContextBase
继承了DBML生成的XDataContext
不幸的是,它没有帮助。 魔法!!
UPDATE。 this.GetTable<XDbCurrencyRate>
起作用, this.XDbCurrencyRates
起作用, this.Get<XDbCurrencyRate>
不能起作用, Get
是扩展方法或基类中的方法。 顺便说一句,在内部, this.XDbCurrencyRates
的实现绝对像我的Get
。 魔法!!
UPDATE。 看来Linq-to-SQL仅支持两件事:直接调用DataContext.GetTable<>
或调用返回System.Data.Linq.Table<XDbCurrencyRate>
的任何命名属性。 如果我创建System.Data.Linq.Table<XDbCurrencyRate> Foo
,但是当我创建IQueryable<XDbCurrencyRate> Foo
它崩溃时, Queries with local collections are not supported.
。 魔法!!
有任何想法吗?
这是因为最初的Get
调用不属于查询树。 只是一个普通的方法调用。 第二个调用嵌入在树中,LINQ to SQL不知道该方法的含义。
我知道EF会立即放弃。 我相信L2S基本上能够在本地运行这种方法并尝试内联它返回的查询。 在这里,这似乎可以解决了(或者我错了)。
我要做的是创建一个自定义LINQ提供程序,该提供程序重写表达式树以在本地执行此类方法,将其结果内联到查询树中,然后转发到LINQ to SQL。 这不是小事。
也许您可以通过所谓的“ LINQ套件”(近似拼写)使AsExpandable
工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.