c# – LINQ多连接IQueryable修改结果选择器表达式
发布时间:2020-12-15 06:26:06 所属栏目:百科 来源:网络整理
导读:想象一下下面的表格结构 ---------TableAIDName---------TableBIDTableAID---------TableCIDTableBID 我想定义一个连接这三个表并接受表达式 Func TableA,TableB,TableC,T的函数.作为选择器. 所以我想要以下内容: public IQueryableT GetJoinedViewT(Expres
想象一下下面的表格结构
--------- TableA ID Name --------- TableB ID TableAID --------- TableC ID TableBID 我想定义一个连接这三个表并接受表达式< Func< TableA,TableB,TableC,T>>的函数.作为选择器. 所以我想要以下内容: public IQueryable<T> GetJoinedView<T>(Expression<Func<TableA,T>> selector) { return from a in DbContext.Set<TableA>() join b on DbContext.Set<TableB>() a.ID equals b.TableAID join c on DbContext.Set<TableC>() b.ID equals c.TableBID select selector; } 现在,显然上面没有做我想做的事情,这将给我一个表达类型的IQueryable.我可以使用方法链接语法,但最后我需要多个选择器,每个方法链调用一个.有没有办法采取选择器并将其应用于匿名类型,如下面的不完整函数: public IQueryable<T> GetJoinedView<T>(Expression<Func<TableA,T>> selector) { var query = from a in DbContext.Set<TableA>() join b on DbContext.Set<TableB>() a.ID equals b.TableAID join c on DbContext.Set<TableC>() b.ID equals c.TableBID select new { A = a,B = b,C = c }; // I need the input selector to be modified to be able to operate on // the above anonymous type var resultSelector = ModifyInputSelectorToOperatorOnAnonymousType(selector); return query.Select(resultSelector); } 关于如何做到这一点的任何想法? 解决方法
您可以定义一次性中间对象以选择而不是使用匿名类型:
public class JoinedItem { public TableA TableA { get; set; } public TableB TableB { get; set; } public TableC TableC { get; set; } } 新方法: public IQueryable<T> GetJoinedView<T>(Expression<Func<JoinedItem,T>> selector) { return DbContext.Set<TableA>() .Join(DbContext.Set<TableB>(),a => a.ID,b => b.TableAID,(ab) => new { A = a,B = b}) .Join(DbContext.Set<TableC>(),ab => ab.B.ID,c => c.TableBID (ab,c) => new JoinedItem { TableA = ab.A,TableB = ab.B,TableC = c }) .Select(selector); } 你是否真的加入这三个表足以使这个方法的使用更清晰,而不仅仅是在LINQ中直接表达你想要做的事情?我认为每次创建此查询所需的额外行比使用此方法更清晰. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Oracle笔记 三、function 、select
- ruby – RestClient.get返回证书验证失败
- Linq to XML 增删改查
- ruby-on-rails-3 – Roo出错.任何用于解析.ods文件的gem
- PlausibleDatabase.framework 使用的类库
- ios – 使用UIActivityViewController与Facebook Messenger
- NAND Flash中常用的纠错方式【转】
- 将现有代码从C#2.0移植到C#3.0和.Net 3.5(可能是.net 4.0)
- 正则表达式清理日志
- Oracle的EXTRACT功能是否打破了XMLELEMENT中的NOENTITYESCA