繁体   English   中英

Linq-to-SQL中的奇怪异常

[英]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]. 当我改变GetGetTable -一切正常! 当我将Get的返回类型从IQueryable<T>更改为Table<T> ,它会崩溃。

UPDATE。 我创建了XDataContextBase类,将Get方法移到那里, XDataContextXDataContextBase继承了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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM