【问题标题】:linq to entity stored procedure return that needs extra joins after the factlinq 到实体存储过程返回,事后需要额外的连接
【发布时间】:2012-02-17 15:13:55
【问题描述】:

我有一个返回表类型的存储过程。但是,具有存储过程的 EF 模型只返回当前的表类,而不返回关联的类。因此,当我遍历引用的(子/父)表时,这些引用的表值到处都是空值。

我知道这是预期的,因为存储过程仅返回该表(从该表中选择 *),但我现在想在调用存储过程后创建一个连接子句以访问其余引用的表我的 EF 模型。

这是我的代码,稍作修改以便于理解我需要什么...

var coll = db.SearchContacts(keyword,param1,param2)
//returns Contact types,works great

...现在我想做什么....(虽然我知道语法已关闭)

var ExtColl = coll join db.Address on coll.Address 
               join db.Department on coll.Department <- something similar 

...这样我现在可以访问那个部门 (department.desc), 或此联系人的地址(address.civic)信息。

在我已经从数据库中的存储过程中收到这种格式之后,我不知道如何实现这种格式。


好的,这里是我正在做的更新...

var ps = from d in db.SearchContacts(param1,param2)
         select d.Id;
var p = from e in db.Contacts
        .Include("Table1Ref")
        .Include("Table2Ref")
        .Include("Table3Ref")
        Where(BuildOrExpression<DBMOdel.Contact,long>(e=>e.Id,ps.ToList()))
        select e;

现在我得到了我想要的回报,除了一件事...... 有些表引用了进一步引用的表 我想添加,并且 Include 不允许 我直接将它们添加到联系人中,因为这些表不是 引用联系人但另一个引用联系人的表 一层/级别进一步...所以联系人参考地址 和地址参考省... 我需要访问省份信息(例如描述) 但需要正确完成我的加入语句....

所以我正在考虑使用 join 语句,但不知道这种分配或连接的语法...... 联系人 -> AdressId 上的地址,地址 -> ProvinceId 上的省份

所以我认为我的 linq 语句看起来像这样......

var p = from e in db.Contacts
        .Include("Table1Ref")
        .Include("Table2Ref")
        .Include("Table3Ref")
        Where(BuildOrExpression<DBMOdel.Contact,long>(e=>e.Id,ps.ToList()))
->      join o in db.Province on o.ProvinceId equals e.Address.ProvinceId
        select e;

但没有达到预期的效果...有人可以帮忙吗? 我想我可能还会将 linq 与 sql 或对象与 linq 与实体混合... 这是我得到的错误

“调用 'Join' 方法的键选择器类型在底层存储提供程序中不可比较。”

【问题讨论】:

    标签: c# .net linq stored-procedures linq-to-entities


    【解决方案1】:

    没有将表连接到存储过程的 SQL 语法,因此 EF 也无法做到这一点。

    替代方案:

    • 在内存中进行连接(linq to objects)。
    • 在存储过程中执行连接并将其映射到complex type

    后一个选项可能会执行(很多)更好,但不太灵活。由你来权衡利弊。

    【讨论】:

    • 就性能而言,第二个是最佳选择(复杂类型)。 EF 并不适合所有情况,因此对任何其他选项持开放态度。例如,我使用 EF 只是为了保存/更新/删除简单对象的数据。为了检索数据(主/明细、计算字段、报告),我只使用数据表,因为性能和实际用途。
    • 你能告诉我做第一个的语法吗,因为这是我遇到的困难......如前所述,我的回报位于变量 ...var coll .... .,并且我需要对该表和其他表进行连接或包含语法.....所以我添加了一个额外的变量.... .....
    • 应该是coll.ToList(),然后使用join。但这取决于您对联系人的处理方式。如果您并不总是需要所有地址和部门信息,您可以考虑按联系人获取信息。
    • 我添加了一条评论以获得正确的代码格式,而不是回复您的回复,如果您不介意看一下,我会非常感激
    • 您可以做.Include("Address.Province") 或更多一般.Include("Children.Children").Include("Parent.Children") 等。顺便说一句,最好编辑您的原始帖子,而不是在答案中添加新信息和问题。毕竟这不是一个答案:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多