【问题标题】:beginner Linq syntax and EF4 question初学者 Linq 语法和 EF4 问题
【发布时间】:2011-01-08 01:20:38
【问题描述】:

问题

使用以下 linq 代码片段,我得到了一个客户列表,其地址按规范过滤,但返回的实体形式不是我所期望的。

数据是1个客户端有2个地址和1个客户端有1个地址。

查询返回 3 行客户端,每行有 1 个地址

  • 客户端 1 => 地址 1
  • 客户端 1 => 地址 2
  • 客户端 2 => 地址 3

    var query = from t1 in context.Clients.Where(specification.SatisfiedBy()).Include("ClientAddresses")
                join t2 in context.ClientAddresses.Where(spec.SatisfiedBy())
                on t1.ClientKey equals t2.ClientKey
                select t1;
    

我的期望更像是一个只有两个客户的列表,一个客户包含两个地址的集合,一个客户包含一个地址的集合。

  • 客户端 1 => 地址 1 / 地址 2
  • 客户端 2 => 地址 3

我错过了什么???

谢谢!

【问题讨论】:

  • 这越来越近了。这将返回 3 个客户端,但地址数量正确。 var query = from t1 in context.Clients.Where(specification.SatisfiedBy()) join t2 in context.ClientAddresses.Where(spec.SatisfiedBy()) on t1.ClientKey 等于 t2.Client.ClientKey into x from t2 in x select t1;

标签: linq entity-framework-4


【解决方案1】:

您是否尝试过类似的方法: query = query.Distinct();?

您可能需要透露规范的编写方式以提供更多数据。

例如,我不明白为什么您的查询不是这样的:

var query = from t1 in context.Clients.Include("ClientAddresses")
            where specification.SatisfiedBy() &&
                t1.ClientAddresses.Any(spec.SatisfiedBy())
            select t1;

更新

看看这是否有效。不确定 EF 支持多少。它与您的原始查询非常相似

var query = (from t1 in context.Clients.Where(specification.SatisfiedBy())
                 .Include("ClientAddresses")
             from t2 in context.ClientAddresses.Where(spec.SatisfiedBy())
             where t1.ClientKey == t2.ClientKey
             select t1)
            .Distinct();

【讨论】:

  • distinct 对我的原始查询有效,但会产生一个 50 行的怪物 sql 语句。 =( 复合规范模式(借用)适用于 IQuerable (Expression>) 和 t1.ClientAddress.Any() 是 IEnumerable。(Func) 我不知道如何做到这一点工作。
  • 关于怪物查询,你有没有试过看执行计划?有时怪物查询并没有那么糟糕(大多数时候它们是肯定的)。
  • 查看我的更新,关于 Any,我知道它有 IQueryable 版本。模型是EF生成的还是自己编码的?
  • 事实上,您很可能需要更改规范本身以支持从“客户端”开始的调用(意味着支持通过集合)。不是你肯定想要的。
  • 您是否看到动态 LINQ 库是否有帮助?见albahari.com/nutshell/predicatebuilder.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 2019-06-18
  • 2012-12-31
相关资源
最近更新 更多