【问题标题】:Linq Nhibernate : Unable to pull a value from a foreign key tableLinq Nhibernate:无法从外键表中提取值
【发布时间】:2012-01-27 20:49:22
【问题描述】:

我对此感到很疯狂,非常感谢一些帮助。

想象两个用外键连接的表:

字体 字体颜色

我需要获得一份包含字体表信息的计算机 FontColors 报告。通过实体框架,我显然可以通过以下方式访问字体颜色“字体”表属性:

string fontName = FontColors.Fonts.Name;

简单……对吗?

现在想象一下,我创建了另一个名为 ComputerFontColors 的类,例如,为了匹配我将显示的报告模型(顺便说一下,Jquery Grid 报告),除了一些从我的计算机描述表。

为了填充 ComputerFontColors 类,我们使用如下内容:

var computerFonts = from f in FontColors
                select new ComputerFontColors
{
  FontColor = f.Color,
  FontName = f.Fonts.Name,
  ComputerUsedOn = ComputerServices.GetByFontId(f.Fonts.Id)
}

似乎尽可能简单,但无论出于何种原因,它都不起作用。 Nhibernate Linq 不喜欢“ComputerUsedOn = ComputerServices.GetByFontId(f.Fonts.Id)”部分,只是不断返回“无法实例化:FontFolors”错误。

方法 ComputerServices.GetByFontId(f.Fonts.Id) 本身就可以正常工作。

带有静态值的查询:

var computerFonts = from f in FontColors
                select new ComputerFontColors
{
  FontColor = f.Color,
  FontName = f.Fonts.Name,
  ComputerUsedOn = ComputerServices.GetByFontId(6)
}

工作正常。

但是当我将它们组合在一起时 - 代码崩溃了。 一直卡在这个上。

提前致谢。

【问题讨论】:

    标签: c# linq nhibernate jqgrid


    【解决方案1】:

    为了好玩,试试这个:

    var computerFonts = FontColors.AsEnumerable().Select(f =>
    new ComputerFontColors
    {
      FontColor = f.Color,
      FontName = f.Fonts.Name,
      ComputerUsedOn = ComputerServices.GetByFontId(f.Fonts.Id)
    });
    

    AsEnumerable 强制使用标准 Linq to Objects 方法完成投影,即在内存中。可能是 Linq to NH 无法理解您的投影不能完全在数据库中完成(鉴于 ComputerServices.GetByFontId 是一种无法转换为查询的方法)。

    【讨论】:

    • 但要小心! f.Fonts 指的是可能不会急切获取的关联,因此这里存在潜在的SELECT N+1 问题。始终使用 SQL Profiler 或 NProf 或类似的工具来确保您的查询保持高性能。 :-)
    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2019-05-17
    • 2014-10-03
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多