Linq使用包含存储过程

时间:2014-02-23 09:20:03

标签: c# linq entity-framework

我有一个存储过程,它返回一些日期,以及与表中特定行相关的Id。

基本上,我收到了帐户组合中所有帐户的所有预定交易的列表。

存储过程返回一行,其中包含Id(用于计划的事务),以及我在proc中记录的一些日期。

如果我的查询开头于:

from p in Context.scheduled_transactions
然后这个计划就可以了。但我不想得到这样的项目,因为在proc中,我正在做很多工作来创建业务日期等。所以,我没有带回EF模型 - 我的proc只是带回ID。我正在希望做这样的事情:

var trans = (from p in Context.get_scheduled_payments_by_portfolio(portfolioId)
                                          .Include("account")
                                          .Include("cost_centre")
                                          .Include("z_account_transaction_type")
                                          .Include("z_payment_frequency_type")
                                          .Include("transaction_sub_category")
                                          .Include("transaction_sub_category.transaction_category")
                                          .Include("third_party")
                         select p).ToList();

但是,EF不能使用'Include',因为它不知道我带回来了什么。虽然id​​在proc中被称为'scheduled_transaction_id' - 但EF并不知道(可以理解)。

我有没有办法告诉EF该ID是否为scheduled_transaction_model - 然后使用'Include'?

也许我只需要调用proc,它返回我的对象​​列表,其中包含scheduled_transaction_id,以及我在proc中计算的所有日期,然后以某种方式使用该List<>在另一个可以加入其他表的linq查询中?

编辑: 我可能会做点什么!这不会显示语法错误。只需创建一个新类型...玩这个:

var trans = (from p in Context.get_scheduled_payments_by_portfolio(portfolioId)
                         join st in Context.scheduled_transaction 
                                          .Include("account")
                                          .Include("cost_centre")
                                          .Include("z_account_transaction_type")
                                          .Include("z_payment_frequency_type")
                                          .Include("transaction_sub_category")
                                          .Include("transaction_sub_category.transaction_category")
                                          .Include("third_party")
                                          on p.scheduled_transaction_id equals st.id 
                         select p).ToList();

2 个答案:

答案 0 :(得分:1)

var ids = Context.get_scheduled_payments_by_portfolio(portfolioId).ToList();

var trans = (from p in Context.scheduled_transaction 
                  .Include("account")
                  .Include("cost_centre")
                  .Include("z_account_transaction_type")
                  .Include("z_payment_frequency_type")
                  .Include("transaction_sub_category")
                  .Include("transaction_sub_category.transaction_category")
                  .Include("third_party")
            where ids.Contains(p.id)
            select p).ToList();

尝试将Contains()方法转换为SQL的IN(,,)语句。

答案 1 :(得分:0)

答案是join我正在使用的表格的proc,然后我可以使用.Include()

var trans = (from p in Context.get_scheduled_payments_by_portfolio(portfolioId)
                         join st in Context.scheduled_transaction 
                                          .Include("account")
                                          .Include("cost_centre")
                                          .Include("z_account_transaction_type")
                                          .Include("z_payment_frequency_type")
                                          .Include("transaction_sub_category")
                                          .Include("transaction_sub_category.transaction_category")
                                          .Include("third_party")
                                          on p.scheduled_transaction_id equals st.id 
                         select new {st, p}).ToList();

然后使用新类型,我可以通过列表进行迭代,并构建我的对象。