相关疑难解决方法(0)

鉴于LINQ to Entities不支持"自定义方法",您如何保持DRY?

我遇到过这个问题:

自定义方法和扩展方法无法转换为商店表达式

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

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

LINQ to Entities无法识别方法'System.Linq.IQueryable`1 [Thread] GetThreadsByMostReccentlyPosted(Int32)'方法,并且此方法无法转换为商店表达式.

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

鉴于这种限制,我如何使用LINQ to Entities保持DRY?

linq-to-entities entity-framework linq-to-sql

8
推荐指数
1
解决办法
3989
查看次数

在Entity Framework Query中使用C#函数

在我的C#代码中,我有2个WHERE查询,我可以在IQueryable上调用它们,并将整个事务编译成SQL,并且这两个查询都有很多共同的逻辑.

我相信这不是这个类似问题的重复: 在实体框架查询的选择子句中使用函数,因为在我的场景中,有问题的函数可以转换为SQL - EF只是没有意识到它可以这样做.

查询大约是:

public static IQueryable<Template> WhereIsOwnedByUser(this IQueryable<Template> set, User user)
{
    return set.Where(temp =>
        temp.Requests
            .Where(req => req.WasSent)
            .OrderByDescending(req => req.DueDate)
            .Take(2)
            .SelectMany(req => req.RequestRecipients.Select(reqRecip => reqRecip.Recipient.Id))
            .Contains(user.Id));
}
Run Code Online (Sandbox Code Playgroud)

public static IQueryable<Template> WhereIsOwnedByUser(this IQueryable<DataReturn> set, User user)
{
    return set.Where(ret=>
        ret.Entity.Id == user.Entity.Id
        &&
        ret.Request.Template.Requests
            .Where(req => req.WasSent)
            .OrderByDescending(req => req.DueDate)
            .Take(2)
            .SelectMany(req => req.RequestRecipients.Select(reqRecip => reqRecip.Recipient.Id))
            .Contains(user.Id));
}
Run Code Online (Sandbox Code Playgroud)

因此,"拥有模板"的基本BusinessLogic规则,然后是"拥有DataReturn,如果公司匹配AND拥有模板"的必然结果

正如您所看到的,只考虑C#,这些可以很容易地重构为:

private static bool UserOwnsTemplate(User user, Template temp)
{
    return temp.Requests
               .Where(req => req.WasSent) …
Run Code Online (Sandbox Code Playgroud)

c# sql-server entity-framework function

8
推荐指数
1
解决办法
1097
查看次数

创建动态谓词 - 将属性作为参数传递给函数

我正在尝试创建动态谓词,以便它可以用于过滤列表

 public class Feature
 {
   public string Color{get;set;}
   public string Weight{get;set;}
 }
Run Code Online (Sandbox Code Playgroud)

我希望能够创建一个动态谓词,以便可以过滤List.我得到一些条件,因为字符串值">","<","> ="等.有什么方法可以做到这一点?

public Predicate<Feature> GetFilter(X property,T value, string condition) //no clue what X will be
 {
            switch(condition)
            {
              case ">=":
               return new Predicate<Feature>(property >= value)//or something similar
            }               
 }
Run Code Online (Sandbox Code Playgroud)

用法可能是:

 var filterConditions=GetFilter(x=>x.Weight,100,">=");
Run Code Online (Sandbox Code Playgroud)

如何定义GetFilter?以及如何在其中创建谓词?

c# lambda expression dynamic predicates

7
推荐指数
1
解决办法
4376
查看次数