Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql 鉴于LINQ to实体不支持;“自定义方法”;如何保持干燥?_Linq To Sql_Entity Framework_Linq To Entities - Fatal编程技术网

Linq to sql 鉴于LINQ to实体不支持;“自定义方法”;如何保持干燥?

Linq to sql 鉴于LINQ to实体不支持;“自定义方法”;如何保持干燥?,linq-to-sql,entity-framework,linq-to-entities,Linq To Sql,Entity Framework,Linq To Entities,我遇到了这个问题: 基本上我有一些复杂的LINQ查询,所以我想把它们分解成子查询,这些子查询被实现为返回iQueryTables的方法。我希望这些IQueryables可以在一个LINQ语句中组合在一起(我很确定您可以在LINQtoSQL中这样做) 问题是,如果您尝试此方法,您会得到(例如): LINQ to实体无法识别 方法 'System.Linq.IQueryable'1[线程] GetThreadsByMstreccentlyPosted(Int32)' 方法,并且此方法不能为空 翻译

我遇到了这个问题:

基本上我有一些复杂的LINQ查询,所以我想把它们分解成子查询,这些子查询被实现为返回iQueryTables的方法。我希望这些IQueryables可以在一个LINQ语句中组合在一起(我很确定您可以在LINQtoSQL中这样做)

问题是,如果您尝试此方法,您会得到(例如):

LINQ to实体无法识别 方法 'System.Linq.IQueryable'1[线程] GetThreadsByMstreccentlyPosted(Int32)' 方法,并且此方法不能为空 翻译成商店表达式

在我看来,如果您使用LINQ ORM,那么您需要能够组合LINQ查询,这是非常基本的。否则,必须复制并粘贴任何公共查询逻辑


考虑到这个限制,使用LINQ to实体如何保持干爽?

EF不能用包含方法的LINQ表达式组成查询。EF需要文字值来组成SQL

您必须处理返回给定案例所需实体超集的“公共”查询,然后使用扩展方法和LINQ缩小从数据库返回的返回集

两种方式:

  • 可以使用返回表达式的方法
  • 分离可查询位和可枚举位
  • 对于#1,考虑:

    public Expression<Func<Foo, bool>> WhereCreatorIsAdministrator()
    {
        return f => f.Creator.UserName.Equals("Administrator", StringComparison.OrdinalIgnoreCase);
    }
    
    public void DoStuff()
    {
        var exp = WhereCreatorIsAdministrator();
        using (var c = new MyEntities())
        {
            var q = c.Foos.Where(exp); // supported in L2E
            // do stuff
        }
     }
    
    这可能效率较低,也可能没问题。这取决于你在做什么。它通常适用于投影,但通常不适用于限制


    更新刚从Damien Guard看到。

    所以你真正想知道的是“我如何在EF中执行延迟执行,就像在L2S中一样?”。到目前为止,我能看到的唯一方法是将IQueryable转换为IEnumerable,在这一点上,我怀疑您失去了生成最佳SQL语句的能力否-与延迟执行无关。基本上,它不会让我写包含方法的linq语句。当你说“公共查询”时,你是指IEnumerables吗?e、 g.具有结果集而不是IQueryable的东西?我所说的“公共查询”是指可用于返回所需实体的可管理大小的超集的参数化查询。您设计的查询将取决于您的数据以及您拥有的数据量。我明白了。但这意味着内存连接等?我更喜欢选项一。因为我有一些非常复杂的LINQ表达式,很难维护。必须做点什么。
    var partialFilter = from p in ctx.People
                        where p.Address.City == “Sammamish”
                        select p;
    
    var possibleBuyers = from p in partiallyFilter.AsEnumerable()
                         where InMarketForAHouse(p);
                         select p;