Linq查询Oracle的.Any和.Contains错误

时间:2015-02-06 09:22:29

标签: linq

我正在尝试在LINQ中创建以下代码。我正在使用Linqpad来测试我的代码,但不断收到错误:

  

“NotSupportedException:不支持使用表达式http://localhost:14722/WCFDataservice.svc/RNIS_DRE_AREA_V构造或初始化类型<> f__AnonymousType0 2[LINQPad.User.RNIS_MAINTBOUNDARY_V,System.Linq.IQueryable 1 [System.Int32]]的实例。”

我的代码如下:

var roads =
from d in RNIS_MAINTBOUNDARY_V
let ts2 =    
            from dretab in RNIS_DRE_AREA_V
            select dretab.DRE_CODE 
        where ts2.Contains(d.AUTH_ID)
    select d;
    roads.Dump();

作为参考,连接的2个字段,即auth_id和dre_code都是Oracle编号字段。为什么我会收到此错误?

1 个答案:

答案 0 :(得分:0)

您的LINQ查询被转换为方法调用链

var roads = RNIS_MAINTBOUNDARY_V
    .Select(d => new { d, ts2 = RNIS_DRE_AREA_V.Select(dretab => dretab.DRE_CODE) })
    .Where(τ0 => τ0.ts2.Contains(τ0.d.AUTH_ID))
    .Select(τ0 => τ0.d);

任何异常看起来LINQ to Entities都不喜欢{ d, ts2 = ... }匿名类型。

尝试将内部查询移动到lambda:

var roads = RNIS_MAINTBOUNDARY_V
    .Where(d => RNIS_DRE_AREA_V.Select(dretab => dretab.DRE_CODE).Contains(d.AUTH_ID));

LINQ to Entities也可能不喜欢 this ,所以你可以试试真正的联接:

var roads = RNIS_MAINTBOUNDARY_V
    .GroupJoin(
        RNIS_DRE_AREA_V,
        d => d.AUTH_ID,
        dretab => dretab.DRE_CODE
        (d, dretabs) => new { d, count = dretabs.Count() })
    .Where(p => p.count > 0)
    .Select(p => p.d);