linq-to-sql – 鉴于LINQ to Entities不支持“自定义方法”,你如何保持DRY?

前端之家收集整理的这篇文章主要介绍了linq-to-sql – 鉴于LINQ to Entities不支持“自定义方法”,你如何保持DRY?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我遇到过这个问题:

Custom Methods & Extension Methods cannot be translated into a store expression

基本上我有一些复杂的LINQ查询,所以想要将它们分解为子查询,这些子查询被实现为返回IQueryables的方法.我希望这些IQueryable可以在LINQ语句中组合在一起(因为我很确定你可以在LINQ to sql中做到).

问题是如果你试试这个(例如):

LINQ to Entities does not recognize
the method
‘System.Linq.IQueryable`1[Thread]
GetThreadsByMostReccentlyPosted(Int32)’
method,and this method cannot be
translated into a store expression.

对我来说,如果你使用LINQ ORM,那么你需要能够编写LINQ查询.否则,任何常见的查询逻辑都必须是copy&粘贴.

鉴于这种限制,我怎么能用LINQ to Entities保持DRY?

解决方法

两种方式:

>可以使用返回表达式的方法
>分隔可查询和可枚举位

对于#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
    }
 }

有关数字2的示例,请阅读本文:How to compose L2O and L2E queries.请考虑给出的示例:

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;

这可能效率较低,或者可能没问题.这取决于你在做什么.投影通常很好,通常不适合限制.

更新刚从Damien Guard看到an even better explanation of option #1.

猜你在找的MsSQL相关文章