我遇到过这个问题:
基本上我有一些复杂的LINQ查询,所以想把它们分解成子查询,这些子查询被实现为返回IQueryables的方法.我希望这些IQueryable可以在LINQ语句中组合在一起(因为我很确定你可以在LINQ to SQL中做到).
问题是如果你试试这个(例如):
LINQ to Entities无法识别方法'System.Linq.IQueryable`1 [Thread] GetThreadsByMostReccentlyPosted(Int32)'方法,并且此方法无法转换为商店表达式.
对我来说,如果你使用LINQ ORM,那么你需要能够编写LINQ查询.否则,必须复制和粘贴任何常见的查询逻辑.
鉴于这种限制,我如何使用LINQ to Entities保持DRY?
在我的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) 我正在尝试创建动态谓词,以便它可以用于过滤列表
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# ×2
dynamic ×1
expression ×1
function ×1
lambda ×1
linq-to-sql ×1
predicates ×1
sql-server ×1