【问题标题】:How Select From Parent Based on Child Property in EntityFramework and ESQL如何在 EntityFramework 和 ESQL 中基于子属性从父级中选择
【发布时间】:2011-02-28 07:43:34
【问题描述】:

我在实体框架中有一个父/子表,我需要根据子主键从父表中选择一些行。

我写了这些代码:

List<int> s = (from all in DB.TbProfiles
                    where all.TbMaharat.Any(c => maharat.Contains(c.MaharatId))
                    select all.ProfileId).ToList();

但我发现 Linq2Entity 不支持“包含”,我必须使用“MultiSet”和 ESQL 命令。但我可以找到任何样本来做到这一点。

我这样写 ESQL 但它不起作用:

byte[] moshTypes = new byte[] { 1, 2, 3 };

        List<int> s =  DB.TbProfiles.Where("it.TbMaharat exists(Select 0 from TbMaharat as e where e.MaharatId IN MultiSet (" + string.Join(",", moshTypes) + "))")
            .Select(c=>c.ProfileId).ToList();

        return s;

谁能帮帮我?

【问题讨论】:

  • 您的第一句话中的maharat 是什么?
  • "maharat" 是字节数组,就像第二个代码 "moshTypes",它们是一样的
  • EF 4 确实支持IEnumerable&lt;T&gt;.Contains()

标签: c# .net entity-framework entity-sql


【解决方案1】:

要使用IEnumerable&lt;T&gt;.Contains() 方法,您必须使用ToList()ToArray() 将表加载到内存中。然而,这可能会导致巨大的内存成本,所以除非表非常小并且不会及时增长,否则不要这样做。 Contains 方法有一个解决方法:为每个值构建一个 OR 表达式,以便 Contains() 方法变为 DB.TbMaharat.Where(x=&gt;x.MaharatId == 1 || x.MaharatId == 2 || x.MaharatId == 3)。请参阅 MSDN 线程了解如何执行此操作:http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/095745fe-dcf0-4142-b684-b7e4a1ab59f0/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2013-07-07
    • 1970-01-01
    • 2017-12-18
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多