【问题标题】:Linq to SQL and Gridview DatasourceLinq to SQL 和 Gridview 数据源
【发布时间】:2009-05-03 23:34:43
【问题描述】:

我有一个与this one 相关的问题。我不想进行计算(聚合),但我需要从关联中获取显示值。在我的 C# 代码中,我可以直接引用该值,因为外键约束使 Linq 生成所有必要的接线。 当我将 IQueryable 指定为 Gridview 数据源属性并引用不是结果集中主要实体的列的内容时,我收到该列不存在的错误。 作为 Linq 的新手,我猜测赋值隐式地将 IQueryable 转换为列表,并且关联丢失了。 我的问题是,这样做的好方法是什么?

我假设我可以通过编写一个并行查询来解决这个问题,该查询返回一个匿名类型,其中包含我需要用于 gridview 的所有列。似乎通过这样做,我会在内存中冗余地保存我已经拥有的数据。我可以在分配数据源时动态查询内存中的数据结构吗?还是有更直接的解决方案?

gridview 应该显示医生的医疗组关联,关联的名称在查找表中。

            IQueryable<Physician> ph =
                        from phys   in db.Physicians
                        //from name   in phys.PhysicianNames.DefaultIfEmpty()
                        //from lic    in phys.PhysicianLicenseNums.DefaultIfEmpty()
                        //from addr   in phys.PhysicianAddresses.DefaultIfEmpty()
                        //from npi    in phys.PhysicianNPIs.DefaultIfEmpty() 
                        //from assoc  in phys.PhysicianMedGroups.DefaultIfEmpty()
                        where phys.BQID == bqid
                        select phys;


(来源:heeroz.com

因此,根据 Denis 的回答,我从查询中删除了所有不需要的内容。我想我可能一开始就问错了问题。

无论如何,该页面显示的是医生的数据。我想在网格中显示所有医疗团体隶属关系(并让用户插入、编辑和更新隶属关系)。我现在意识到我不需要显式加入这些其他表——Linq 为我做到了。我可以通过子关联链引用许可证号来访问单独的表中的许可证号。 我无法在 gridview 中引用医疗组名称,这让我回到了我的问题:

AffiliationGrid.DataSource = ph.First().PhysicianMedGroups;

这不起作用,因为 GridView 无法访问 med_group_print_name:

A field or property with the name 'med_group_print_name' was not found on the
selected data source.

再次,请耐心等待,如果我不理解 Linq 太明显了……因为我不理解。

【问题讨论】:

    标签: linq-to-sql gridview join


    【解决方案1】:

    您的问题似乎很奇怪。您应该尝试简单地显示

    ph = from phys in db.Physicians
         where phys.BQID == bqid
         select phys;
    

    在您的网格中。那应该行得通。 另外,为什么调用 Load()?如果在绑定网格时 DataContext 没有被释放,你应该不需要它。

    如果您仍然有问题,能否请您发布您收到的错误消息,这会有所帮助...

    第 2 部分

    问题是您的名字实际上不在 PhysMedGroup 中。您需要向下导航到 MedGroupLookup 才能访问该名称,因为它是该类的属性。

    根据您使用的技术(可能是 WinForms 或 Web 表单),您需要配置数据绑定以访问 MedGroupLookup.med_group_print_name。

    【讨论】:

    • 是的,我认为可能不需要这些负载。我修改了我的问题。
    • 或者,更确切地说,很快就会这样做。
    • 然后我得到这个:在所选数据源上找不到名为“MedGroupLookup.med_group_print_name”的字段或属性。
    • 我了解查询在应用程序中形成时不会运行,而是在应用程序访问其数据时运行。当我运行数据库跟踪时,我看到的唯一查询是针对医生_med_group 表,但没有与查找表的连接——因为数据源分配没有引用查找表,并且页面中的列声明没有被评估那时候。求值的时候拉入名字已经来不及了,GridView和IQueryable交互的不是简单的列表,而是一个简单的列表。所以我需要一些方法来确保在分配数据源之前完成连接。
    • 如果 DataContext 没有被释放,你访问 MedGroupLookup 的简单事实应该加载它。但是为了性能,你可以让它发出一个联合查询: db.LoadOptions= new LoadOptions(); db.LoadOptions.LoadWith(x => x.PhysicianMedGroups); db.LoadOptions.LoadWith(x => x.MedGroupLookup);在发出查询之前执行此操作,它应该会急切地加载整个查询。
    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2010-10-08
    • 1970-01-01
    相关资源
    最近更新 更多