我想做这样的事情:
List<SomeClass> list1 = ...
List<SomeClass> list2 = ...
Predicate<SomeClass> condition = ...
...
list2.RemoveAll (!condition);
...
list2.AddRange (list1.FindAll (condition));
Run Code Online (Sandbox Code Playgroud)
但是,这会导致编译器错误,因为!无法应用Predicate<SomeClass>.有没有办法做到这一点?
我在我的数据访问层中使用LINQ to Entities for Entity Framework对象.
我的目标是尽可能多地从数据库中过滤,而不将过滤逻辑应用于内存中的结果.
为此,业务逻辑层将谓词传递给数据访问层.
我的意思是
Func<MyEntity, bool>
Run Code Online (Sandbox Code Playgroud)
所以,如果我直接使用这个谓词,就像
public IQueryable<MyEntity> GetAllMatchedEntities(Func<MyEntity, Boolean> isMatched)
{
return qry = _Context.MyEntities.Where(x => isMatched(x));
}
Run Code Online (Sandbox Code Playgroud)
我得到了例外
[System.NotSupportedException] --- {"LINQ to Entities中不支持LINQ表达式节点类型'Invoke'."}
该问题的解决方案建议使用LINQKit库中的AsExpandable()方法.
但是再次使用
public IQueryable<MyEntity> GetAllMatchedEntities(Func<MyEntity, Boolean> isMatched)
{
return qry = _Context.MyEntities.AsExpandable().Where(x => isMatched(x));
}
Run Code Online (Sandbox Code Playgroud)
我得到了例外
无法将类型为"System.Linq.Expressions.FieldExpression"的对象强制转换为"System.Linq.Expressions.LambdaExpression"
有没有办法在LINQ to Entities查询实体框架对象中使用谓词,以便将其正确转换为SQL语句.
谢谢.
在查看MSDN之后,我仍然不清楚如何使用T的成员变量(其中T是一个类)在List中使用Find()方法形成一个正确的谓词
例如:
public class Car
{
public string Make;
public string Model;
public int Year;
}
{ // somewhere in my code
List<Car> carList = new List<Car>();
// ... code to add Cars ...
Car myCar = new Car();
// Find the first of each car made between 1980 and 2000
for (int x = 1980; x < 2000; x++)
{
myCar = carList.Find(byYear(x));
Console.Writeline(myCar.Make + myCar.Model);
}
}
Run Code Online (Sandbox Code Playgroud)
我的"byYear"谓词应该是什么样的?
(MSDN示例仅讨论恐龙列表,仅搜索不变的值"saurus" - 它没有显示如何将值传递给谓词...)
编辑:我正在使用VS2005/.NET2.0,所以我不认为Lambda符号可供我使用...
EDIT2:在示例中删除了"1999",因为我可能希望根据不同的值以编程方式"查找".使用for-do循环将示例更改为1980年至2000年的汽车范围.
任何人都可以帮助我解决我的问题.我使用下面给出的代码:
public IEnumerable<InvoiceHeader> Getdata(Expression<Func<InvoiceHeader, bool>> predicate)
{
return AccountsContext.InvoiceHeaders.Include("Company").Include("Currency")
.Include("BusinessPartnerRoleList").Include("DocumentType")
.Where(predicate);
}
Run Code Online (Sandbox Code Playgroud)
.....
在我的代码中我使用如下
Expression<Func<InvoiceHeader, bool>> predicate = PredicateBuilder.True<InvoiceHeader>();
predicate = predicate.And(o => o.CompanyId == oInvoiceHeader.CompanyId);
List<InvoiceHeader> lstInvheader=Getdata(predicate).ToList();
Run Code Online (Sandbox Code Playgroud)
通过这样做,我得到了例外.[System.NotSupportedException] --- {"LINQ to Entities中不支持LINQ表达式节点类型'Invoke'."}
我正在尝试编写用于STL算法的谓词函数.我看到它们是两种定义谓词的方法:
(1)使用如下简单的功能:
bool isEven(unsigned int i)
{ return (i%2 == 0); }
std::find_if(itBegin, itEnd, isEven);
Run Code Online (Sandbox Code Playgroud)
(2)使用operator()函数如下:
class checker {
public:
bool operator()(unsigned int i)
{ return (i%2 == 0); }
};
std::find_if(itBegin, itEnd, checker);
Run Code Online (Sandbox Code Playgroud)
我更多地使用第二种类型,因为我通常想创建一个谓词对象,其中包含一些成员并在算法中使用它们.当我在checker中添加相同的isEven函数并将其用作谓词时,我收到一个错误:
3.语法,它给出了错误:
class checker {
public:
bool isEven(unsigned int i)
{ return (i%2 == 0); }
};
checker c;
std::find_if(itBegin, itEnd, c.isEven);
Run Code Online (Sandbox Code Playgroud)
调用c.isEven会在编译期间发出错误,指出对某些函数的未定义引用.有人可以解释为什么3.给出错误?此外,我将不胜感激任何关于谓词和迭代器基础知识的指针.
通常只能比较C++中的指针是否相等.相比之下,只有指向同一完整对象(例如数组元素)的子对象的两个指针才允许小于比较.
因此T * p, * q,评估一般是非法的p < q.
标准库包含函数类模板std::less<T>等,它包含内置运算符<.但是,标准有关于指针类型(20.8.5/8)的说法:
对于模板
greater,less,greater_equal,和less_equal,对于任何指针类型的专业化产生总订单,即使内置的运营商<,>,<=,>=没有.
怎么能实现呢?甚至可以实现这个吗?
我看了看GCC 4.7.2和3.2锵,不包含任何的指针类型专业化的.它们似乎依赖于<在所有支持的平台上无条件地有效.
没有发射了反光看差异,但人们所期望看到比较时完全一样的编译代码Func<T, bool> 与Predicate<T>
我认为没有区别,因为它们都采用通用参数并返回bool?
第一次问我:)
我需要一些方法来定义使用格式的泛型的默认谓词
Func<T, bool>
Run Code Online (Sandbox Code Playgroud)
然后将其用作默认参数.像这样的东西:
public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate = (T t) => true)
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我得到编译错误:
'predicate'的默认参数值必须是编译时常量
有没有一种顺利的方法可以做到这一点,我缺少或应该使谓词函数可以为空并相应地改变我的函数逻辑?
谢谢,
在我的方法中,我有我的存储库这样做:
bool isConditionMet = MyRepository.Any(x => x.Condition == true);
Run Code Online (Sandbox Code Playgroud)
我试图使用MOQ来模拟这样:
MyMockedRepository.Setup(x => x.Any(y => y.Condition == true)).Returns(true);
Run Code Online (Sandbox Code Playgroud)
但是,当代码执行时,存储库调用始终返回false.
有没有办法用MOQ做到这一点?
**编辑 - 每个请求添加代码**
我正在使用NHibernate所以我的Any方法在我的基础存储库中并实现如下:
public virtual bool Any(Expression<Func<T, bool>> predicate)
{
return Session.Query<T>().Cacheable().Any(predicate);
}
Run Code Online (Sandbox Code Playgroud) 在 Raku 中,如何编写与 Haskell 函数等价的span函数?
在 Haskell 中,给定一个谓词和一个列表,可以将列表分为两部分:
\n例如,Haskell 表达式 \xe2\x80\xa6
\nspan (< 10) [2, 2, 2, 5, 5, 7, 13, 9, 6, 2, 20, 4]\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x80\xa6 计算为 \xe2\x80\xa6
\n([2,2,2,5,5,7],[13,9,6,2,20,4])\nRun Code Online (Sandbox Code Playgroud)\n如何编写与 Haskell 函数相当的 Raku 函数span?
根据@chenyf的回答,我开发了以下span子例程(后来的额外更新反映了保持忠实于Haskell函数的正逻辑所需的否定谓词)\xe2\x80\xa6spanspan
sub span( &predicate, @numberList )\n {\n my &negatedPredicate = { ! &predicate($^x) …Run Code Online (Sandbox Code Playgroud)