假设我有一些 .NET 代码......
public class EventEnvelope
{
public Dictionary<string, string> Headers { get; set; }
public byte[] Body { get; set; }
}
public class EventSelector
{
public Predicate<Dictionary<string, string>> Selector { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我想将此事件选择器发送到一个不是用 .NET 编写的事件代理。
我如何以跨平台的方式序列化这个谓词,以便用另一种语言编写的程序可以重建谓词并执行它?
我曾想过尝试编写一个序列化程序,它将谓词写出一些 javascript,然后让 rhino 或 jint 解释并在代理处执行它。
或者也许有一种实际的跨平台方式来表示我不知道的谓词?
你怎么认为?
我正在开发多层应用程序解决方案,我的解决方案如下所示
我的Business.Process项目(业务层)只知道Business.DomainObject和Data.Repository项目,因此不知道并且与 Data.Sql.Entity 项目没有关系
我将业务(域)对象发送到存储库并执行在这个项目内部进行映射,然后我在存储库层内使用关系数据层进行 CRUD 过程。
我的传统领域对象是这样的,它只有属性
public class UserBO
{
public string Email { get; set; }
public string Username { get; set; }
public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的业务层类是这样的,
Repository r = new UserRepository();
r.Insert(myUserDomainObject);
Run Code Online (Sandbox Code Playgroud)
一切都很好,但是我的“谓词”查询有一些问题。我的存储库接口中有一个方法
bool IsExists(Expression<Func<BusinessObject,bool>> predicate);
Run Code Online (Sandbox Code Playgroud)
并像这样在我的业务层中使用它;
Repository r = new UserRepository(); <br/>
r.IsExists(p => p.Email.Equals("email address"));
Run Code Online (Sandbox Code Playgroud)
如您所见,它的参数是“业务对象”,但我的实际存储库(与数据库连接)使用我的 dbml 文件内的“数据对象”。
public override bool IsExists(Expression<Func<DataObject, bool>> predicate){
return …Run Code Online (Sandbox Code Playgroud) 我的代码中有以下调用:
var dbResults = new List<CrossReferenceRelationshipEF>();
dbResults = dateTimeFilter == null
? new List<CrossReferenceRelationshipEF>(
CrossReferenceRelationshipRepository.GetAll()
.ToList().OrderBy(crr => crr.ToPartner))
: new List<CrossReferenceRelationshipEF>(
CrossReferenceRelationshipRepository.SearchFor(
crr => crr.HistoricEntries
.Any(he => he.ModifiedDatetime > dateTimeFilter))
.ToList().OrderBy(crr => crr.ToPartner));
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用FakeItEasy来验证当dateTimeFilter有一个值时,SearchFor(…)正在我的存储库中使用正确的函数调用它.
所以我的测试看起来像这样:
A.CallTo(() => crossReferenceRelationshipRepositoryMock.SearchFor(A<Expression<Func<CrossReferenceRelationshipEF,bool>>>.That
.Matches(exp => Expression.Lambda<Func<DateTime>>(((BinaryExpression)exp.Body).Right).Compile().Invoke() == filterByDate)))
.MustHaveHappened(Repeated.Exactly.Once);
Run Code Online (Sandbox Code Playgroud)
哪个不对.什么是测试我是否SearchFor(…)使用正确表达式调用的方法?
crr => crr.HistoricEntries.Any(he => he.ModifiedDatetime > dateTimeFilter)
Run Code Online (Sandbox Code Playgroud)
传入的实际值SearchFor(…)是DateTime.MinValue因此我将断言更改为:
A.CallTo(() => crossReferenceRelationshipRepositoryMock.SearchFor(A<Expression<Func<CrossReferenceRelationshipEF, bool>>>.That
.Matches(exp => Expression.Lambda<Func<DateTime>>(((BinaryExpression)exp.Body).Right).Compile().Invoke() == DateTime.MinValue)))
.MustHaveHappened(Repeated.Exactly.Once);
Run Code Online (Sandbox Code Playgroud)
这是失败的,我得到的例外是
System.InvalidCastException:
Unable to cast object of …Run Code Online (Sandbox Code Playgroud) 我是 spring JPA 的新手。我有一个查询,因此我必须获取结果集并仅获取顶部的行。我不知道如何在 spring JPA 中执行此操作。而且我不希望使用 @Query 注释来完成,因为我被问到不要在代码中进行任何查询。这是我想要转换的
SELECT id,name FROM example_table ORDER BY id DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
我在谓词文件中尝试了这样的事情:
public Predicate getLatest(){
QExampleTable example = QExampleTable.exampleTable;
return (Predicate) example.id.desc();
}
Run Code Online (Sandbox Code Playgroud)
这就是我的 jpa 存储库的样子:
public ExampleTable findOne(MyPredicate.getLatest());
Run Code Online (Sandbox Code Playgroud)
但这行不通,我知道它不会清楚。但我真的不知道如何转换上面的查询。谁能帮我解决这个问题
你如何解释归纳谓词?它们是做什么用的?他们背后的理论是什么?它们仅存在于依赖类型系统中,还是也存在于其他系统中?它们在某种程度上与 GADT 相关吗?为什么它们在 Coq 中默认为 true?
这是 Coq 的一个例子:
Inductive even : nat -> Prop :=
| even0 : even 0
| evens : forall p:nat, even p -> even (S (S P))
Run Code Online (Sandbox Code Playgroud)
你会如何使用这个定义?它是数据类型还是命题?
我有这个运行良好的 Java 8 代码:
//Java 8
@Test public void testPredicates(){
Predicate<Integer> p1 = (i) -> true;
Predicate<Integer> p2 = (i) -> true;
Predicate<Integer> p3 = p1.and(p2);
List<Integer> is = new ArrayList<>();
is.add(1);
is.add(2);
assertTrue(is.stream().allMatch(p1.and(p2)));
}
Run Code Online (Sandbox Code Playgroud)
我在 Groovy (2.2) 中最接近它的是:
//Groovy 2.2
@Test
void test(){
Predicate<Integer> p1 = { i -> true}
Predicate<Integer> p2 = {i -> true}
Predicate<Integer> p3 = p2.and(p1)
List<Integer> is = new ArrayList<>()
is.add(1)
is.add(2)
assert(is.stream().allMatch(p1.and(p2)))
}
Run Code Online (Sandbox Code Playgroud)
Groovy 代码在调用该and方法的行上失败并显示以下内容:
java.lang.ClassCastException: java.lang.Boolean
cannot be cast to …Run Code Online (Sandbox Code Playgroud) 我有以下规范,应该检查 a 是否Magazines在a 下File的列表中:MagazinesSubscription
public static Specification<File> getContainingMagazines(final long subscriptionId){
return new Specification<File>() {
@Override
public Predicate toPredicate(Root<File> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Subquery<Subscription> subscriptionSubquery = query.subquery(Subscription.class);
Root<Subscription> subscriptionRoot = subscriptionSubquery.from(Subscription.class);
ListJoin<Subscription, Magazine> subscriptionMagazineJoin = subscriptionRoot.join(Subscription_.magazines);
Path<Long> subscriptionIdPath = subscriptionRoot.get(Subscription_.id);
subscriptionSubquery.
select(subscriptionRoot).
where(cb.equal(subscriptionIdPath, subscriptionId));
ListJoin<File, Magazine> magazinesJoin = root.join(File_.magazines);
return cb.and(magazinesJoin.get(Magazine_.id).in(subscriptionMagazineJoin.get(Magazine_.id)));
}
};
}
Run Code Online (Sandbox Code Playgroud)
在我的服务中,我正在这样做:
public int findFilesWithSubscription(long subscriptionId) {
List<File> fileList = fileRepository.findAll(FileSpecs.getContainingMagazines(subscriptionId));
return fileList.size();
}
Run Code Online (Sandbox Code Playgroud)
涉及的实体如下:
@Entity
@Table(name = "nim_file")
public …Run Code Online (Sandbox Code Playgroud) Python 是否对谓词函数的名称有一些约定?例如,谓词函数名称以pfor Common Lisp 或?Scheme结尾。有时使用像is_or has_, ...这样的前缀,但在某些情况下它们可能不合适(它们可能很长才有意义,并且不必很明显函数是乍一看的谓词)。
在 Swift 4 中,我有一个 CoreData“Sentence”模型,它有一个字符串属性“englishsentence”。我还有一个“单词”数组,并希望获取“englishsentence”属性包含数组中一个或多个单词的所有句子。
var words = ["today", "yesterday", "tomorrow"]
Run Code Online (Sandbox Code Playgroud)
这个数组只是一个例子。它应该在运行时改变并且可以有任何长度。
在 fetch 请求中,我试图做这样的事情:
let fetchRequest =
NSFetchRequest<NSManagedObject>(entityName: "Sentence")
let predicate = NSPredicate(format: "ANY englishsentence CONTAINS ANY word IN %@", words)
fetchRequest.predicate = predicate
Run Code Online (Sandbox Code Playgroud)
我能够为包含一个特定单词的所有句子创建一个谓词。但是,我无法让它与单词数组一起工作,除非我遍历单词数组并为每个单词发出新的获取请求。但这似乎非常低效。
我写了这个通用谓词:
private static <T> Predicate<T> isNull(){
return Objects::isNull;
}
Run Code Online (Sandbox Code Playgroud)
但是我不能将它与其他这样的谓词结合使用:
private static Predicate<String> isEmpty(){
return string -> string.isEmpty();
}
Run Code Online (Sandbox Code Playgroud)
因为这个片段不会编译(期望 Predicate<String> in or operation):
isNull().or(isEmpty())
Run Code Online (Sandbox Code Playgroud)
有什么想法可以解决吗?谢谢!