加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 我可以在第二个查询中使用编译的查询作为源吗?

发布时间:2020-12-15 17:16:04 所属栏目:百科 来源:网络整理
导读:我有一个很好的编译查询.我传递了一个product_id,它返回该产品的产品评论信息. 是否可以将此编译的查询用作子查询的源?例: from cat in ctx.cat_table join prod in ctx.prod_table on cat.category_id equals prod.category_idselect new{ cat_id = cat.c
我有一个很好的编译查询.我传递了一个product_id,它返回该产品的产品评论信息.

是否可以将此编译的查询用作子查询的源?例:

from cat in ctx.cat_table 
join prod in ctx.prod_table on cat.category_id equals prod.category_id
select new
{
    cat_id = cat.category_id,prod_id = prod.product_id,name = prod.product_name,descript = prod.product_description,price = prod.price,reviews = (from mcq in mycompiledquery(ctx,prod.product_id)
               select new 
               {
                   rating = mcq.review_rating,review = mcq.review_text
               }    
}

我早期尝试做这样的事情会引发一个错误:

The LINQ expression node type ‘Invoke’ is not supported in LINQ to Entities

我想到的一个替代方案是用SQL视图替换我编译的查询,但我担心会出现负面的性能损失.

非常感谢您提供的任何建议.

解决方法

您可以在其他查??询中使用编译查询,但不能使其依赖于外部查询.例子

// You can do 
var someParams = 10;
var dataQuery = from x in ctx.SomeData
                join y in myCompiledQuery.Invoke(ctx,someParams) 
                    on x.Id equals y.Id
                where x.Name = "ABC"
                select new { x,y };

// You can't do - this example will not compile but let's use it for description
var dataQuery = from x in ctx.SomeData
                join y in myCompiledQuery.Invoke(ctx,x.SomeParams) 
                    on x.Id equals y.Id
                where x.Name = "ABC"
                select new { x,y };

区别在于第一个示例只执行委托(编译的查询是委托)并返回IQueryable.第二个示例无法执行委托,因为它依赖于外部查询数据,因此它将其作为必须添加到表达式树并在查询执行期间得到的东西.这会失败,因为EF提供程序无法转换委托调用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读