我正在创建一个Validator<T>班级.我正在尝试SelectMany为我的验证器实现Linq 扩展方法,以便能够使用Linq查询组合表达式,并在基础值发生更改时验证最终结果.
以下测试代码演示了我的意图.
var a = 2;
var b = 3;
var va = Validator.Create(() => a, n => n >= 0 && n < 5);
var vb = Validator.Create(() => b, n => n >= 0 && n < 5);
var vc = from ia in va
from ib in vb
select ia + ib;
Debug.Assert(vc.Value == a + b); //2 + 3
Debug.Assert(vc.Value == 5);
Debug.Assert(vc.IsValid == true);
a = 7;
Debug.Assert(vc.Value == a …Run Code Online (Sandbox Code Playgroud) 编辑此问题,以期使其更清楚。
我们有实体框架代码优先设置。为了示例目的,我简化了两个类,实际上,与“记录”类似,大约有十多个类,其中“项”是导航属性/外键。
物品类别:
public class Item
{
public int Id { get; set; }
public int AccountId { get; set; }
public List<UserItemMapping> UserItemMappings { get; set; }
public List<GroupItemMapping> GroupItemMappings { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
记录类:
public class Record
{
public int ItemId { get; set; }
public Item Item { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
this.User是每个存储库中注入的用户对象,包含在存储库库中。我们有一个包含以下代码的Item存储库:
var items = this.GetAll()
.Where(i => i.AccountId == this.User.AccountId);
Run Code Online (Sandbox Code Playgroud)
我在存储库的基础上创建了follow表达式,以轻松地对其进行过滤(以希望再次使用)。由于LINQ to实体的工作方式,我们无法使用静态扩展方法(System.NotSupportedException“ LINQ to Entities无法识别方法X,并且该方法无法转换为存储表达式。”)。
protected Expression<Func<Item, bool>> ItemIsOnAccount()
{
return item => item.AccountId …Run Code Online (Sandbox Code Playgroud)