- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写一个查询,该查询需要在 realm.xamarin linq 查询中使用“WHERE IN”之类的子句。下面是我试过的查询:
var IdsToMatch = observations.Select(x => x.Id)
var results = from d in realm.All<Observations>() where IdsToMatch.Any(p => p == d.Id) select d;
也用 Contains
试过这个:
var results = from d in realm.All<Observations>() where IdsToMatch.Contains(d.Id) select d;
但这会引发错误:
The method 'Contains' is not supported
The method 'Any' is not supported
解决这个问题的方法是什么?
编辑:
这里是错误的堆栈跟踪:
UNHANDLED EXCEPTION: 06-07 15:04:55.097 I/MonoDroid(24526): System.NotSupportedException: The method 'Any' is not supported 06-07 15:04:55.097 I/MonoDroid(24526): at Realms.RealmResultsVisitor.VisitMethodCall (System.Linq.Expressions.MethodCallExpression m) [0x00596] in :0 06-07 15:04:55.097 I/MonoDroid(24526): at Realms.ExpressionVisitor.Visit (System.Linq.Expressions.Expression exp) [0x000ec] in :0 06-07 15:04:55.097 I/MonoDroid(24526): at Realms.RealmResultsVisitor.VisitMethodCall (System.Linq.Expressions.MethodCallExpression m) [0x0006a] in :0 06-07 15:04:55.097 I/MonoDroid(24526): at Realms.ExpressionVisitor.Visit (System.Linq.Expressions.Expression exp) [0x000ec] in :0 06-07 15:04:55.097 I/MonoDroid(24526): at Realms.RealmResults
1[T].CreateResultsHandle () [0x00037] in <filename unknown>:0
1[T].get_ResultsHandle () [0x0000d] in :0 06-07 15:04:55.097 I/MonoDroid(24526): at Realms.RealmResults
06-07 15:04:55.097 I/MonoDroid(24526): at Realms.RealmResults1[T].GetEnumerator () [0x00000] in <filename unknown>:0
1[T]..ctor (IEnumerable
06-07 15:04:55.097 I/MonoDroid(24526): at System.Collections.Generic.List1 collection) [0x00073] in /Users/builder/data/lanes/3053/a94a03b5/source/mono/external/referencesource/mscorlib/system/collections/generic/list.cs:104
1 source) [0x00011] in /Users/builder/data/lanes/3053/a94a03b5/source/mono/external/referencesource/System.Core/System/Linq/Enumerable.cs:835 06-07 15:04:55.098 I/MonoDroid(24526): at VHS.MobileApp.Mediq.DataAccess.ObservationDatabase+<>c__DisplayClass13.b__8 () [0x00147] in d:\rwagh\mediq\Code\VHS.MobileApp.Mediq.DataAccess\ObservationDatabase.cs:65 06-07 15:04:55.098 I/MonoDroid(24526): at System.Threading.Tasks.Task
06-07 15:04:55.098 I/MonoDroid(24526): at System.Linq.Enumerable.ToList[TSource] (IEnumerable1[TResult].InnerInvoke () [0x00012] in /Users/builder/data/lanes/3053/a94a03b5/source/mono/external/referencesource/mscorlib/system/threading/Tasks/Future.cs:686
1[TResult].GetResult () [0x00000] in /Users/builder/data/lanes/3053/a94a03b5/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:372
06-07 15:04:55.098 I/MonoDroid(24526): at System.Threading.Tasks.Task.Execute () [0x00016] in /Users/builder/data/lanes/3053/a94a03b5/source/mono/external/referencesource/mscorlib/system/threading/Tasks/Task.cs:2523
06-07 15:04:55.098 I/MonoDroid(24526): --- End of stack trace from previous location where exception was thrown ---
06-07 15:04:55.098 I/MonoDroid(24526): at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3053/a94a03b5/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143
06-07 15:04:55.098 I/MonoDroid(24526): at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/3053/a94a03b5/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:201
06-07 15:04:55.098 I/MonoDroid(24526): at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/3053/a94a03b5/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:170
06-07 15:04:55.098 I/MonoDroid(24526): at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/3053/a94a03b5/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:142
06-07 15:04:55.098 I/MonoDroid(24526): at System.Runtime.CompilerServices.TaskAwaiter
编辑 2:
var IdsToMatch = observations.Select(x => x.Id)
var results = from d in realm.All<Observations>() where IdsToMatch.Any(p => p == d.Id) select d;
尝试过:var IdsToMatch = observations.Select(x => x.Id).AsQueryable()
根据 https://github.com/realm/realm-dotnet/blob/7187390529201ba843cd105fc6e3e11acb0c6217/Realm.Shared/linq/RealmResultsVisitor.cs#L121上面写着
internal override Expression VisitMethodCall(MethodCallExpression m)
{
if (m.Method.DeclaringType == typeof(Queryable)) { ...
但这并没有奏效。
最佳答案
好的,这很有趣。答案(目前)是构建一个 LINQ Expression Tree .
Realm 支持 LINQ - 我们解析表达式树(好的,缺少一些位,但基础知识是存在的,我们会定期改进 - 我们将添加包含)。
因此,任何时候您需要在运行时构建一个完全任意的查询表达式时,您都可以借助 LINQ 的强大功能来实现。
下面的示例可能看起来有点复杂,但重点是它使用了标准表达式树,因此您可以使用构建此类树的任何其他代码。
class HasIntKey : RealmObject {
public int UserKey { get; set; }
}
private void FindingManyMatches()
{
using (var theRealm = Realm.GetInstance ("TestingManyKeys.realm")) {
// create some sample data
theRealm.Write (() => {
for (int i = 1; i < 10000; i++) {
var obj = theRealm.CreateObject<HasIntKey> ();
obj.UserKey = i;
}
});
var allInts = theRealm.All<HasIntKey>();
Console.WriteLine ($"Created {allInts.Count()} objects");
var idsToMatch = new[] {42,1003,400,57, 6009};
// technique for how to search for many matches
// use Expression Trees to dynamically build the LINQ statement
// see https://msdn.microsoft.com/en-us/library/mt654267.aspx
ParameterExpression pe = Expression.Parameter (typeof(HasIntKey), "p");
// building an expression like:
// allInts.Where (p => p.UserKey == idsToMatch[0] || p.UserKey == idsToMatch[1]...);
Expression chainedByOr = null;
// left side of the == will be the same for each clause we add in the loop
Expression left = Expression.Property(pe, typeof(HasIntKey).GetProperty("UserKey"));
foreach (int anId in idsToMatch) {
// Create an expression tree that represents the expression 'p.UserKey == idsToMatch[n]'.
Expression right = Expression.Constant(anId);
Expression anotherEqual = Expression.Equal(left, right);
if (chainedByOr == null)
chainedByOr = anotherEqual;
else
chainedByOr = Expression.OrElse (chainedByOr, anotherEqual);
}
MethodCallExpression whereCallExpression = Expression.Call(
typeof(Queryable),
"Where",
new Type[] { allInts.ElementType },
allInts.Expression,
Expression.Lambda<Func<HasIntKey, bool>>(chainedByOr, new ParameterExpression[] { pe }));
// Create an executable query from the expression tree.
IQueryable<HasIntKey> results = allInts.Provider.CreateQuery<HasIntKey>(whereCallExpression);
// now we have our results, display some details!
Console.WriteLine ($"Found {results.Count()} objects");
// Enumerate the results.
foreach (HasIntKey anObj in results)
Console.WriteLine($"Found key {anObj.UserKey}");
}
}
关于c# - realm.xamarin 抛出错误 : The method 'Contains' is not supported. 与 'Any' 相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37675419/
这段代码无法编译: for(vector::iterator it = shapes.end(); it >= shapes.begin(); --it){ *it.update(1,1);
我一直在研究 Common Lisp 对象协议(protocol) (CLOS),我遇到了一个疑问。 有人知道 CLOS 中的“标准方法组合”和“简单方法组合”是什么意思吗? 在“简单方法组合”中,“
在Rust上对值调用方法之间是否有任何区别,如下所示: struct A { e: u32 } impl A { fn show(&self) { println!("{}",
我在一些 StackOverflow 答案中看到了术语抽象方法、具体方法和默认方法的“不同”定义。 Java 语言规范给出的真正定义是什么?请在您的答案中包含相关的支持 JLS 引用资料。 最佳答案
如果method = "post",如何使rest[method]扩展为rest.post(uri, body).then(. .? function proxyUrl() { return
这个问题在这里已经有了答案: Method cannot be translated into a store expression (1 个回答) 关闭 9 年前。 我有一个问题。我在 Visua
它们各自的优缺点是什么? 接口(interface)方法 虚方法 抽象方法 什么时候应该选择什么?做出这一决定时应牢记哪些要点? 最佳答案 虚拟和抽象几乎是一样的。虚方法在基类中有一个可以选择被覆盖的
我在 Meteor.js 上的那段代码出错: 客户端 : Meteor.call("logUser", function(myvar){ console.log("le c
运行代码时出现以下错误 Line: 18 illegal start of expression Line: 18 ';' expected 这意味着第 18 行中有代码写得不正确(public bo
如果可能的话,如何从另一个方法的返回中调用一个方法? 例如…… class Example { public static void main(String[] args) {
当遍历指针的 vector (或其他容器)时,使用以下优势和/或优势之间是否有任何区别: for (it = v.begin(); it != v.end(); ++it) { (*it)->
在从带有参数的 void 方法打印值或将值返回给方法调用者并在方法调用者中打印它之间,哪个被认为是更好的做法(如果有的话)?比如第一个代码摘录是前者,第二个代码摘录是后者: public static
考虑这个例子https://codesandbox.io/s/1yvp4zz5x7?module=%2Fsrc%2FApp.vue Greet1 Greet2
晚上好, 我刚开始使用 Microsoft.Contracts(最新版本)并将其插入示例界面之上,现在它看起来像这样: namespace iRMA2.Core.Interfaces { us
我是 Laravel 4 的新手,并试图弄清楚为什么我收到一个错误,说 Method [show] 不存在。 我没有名为“show”的方法,只能想象这是一个内部的 Laravel 方法,但我不知道如何
有人可以向我解释一下当我们进行下一次返回时“或”(||) 是什么意思吗? 我的意思是这行: 返回封面(值,金额 - 值 [索引],索引 + 1)||覆盖(值、金额、索引 + 1); public st
这个问题已经有答案了: Why doesn't the post increment operator work on a method that returns an int? (11 个回答) 已
我很难理解 jQuery 的 $.method() 和 $(selector).method 之间的区别。 $.method() 实际适用于 DOM 中的哪些元素?如果有人能帮助解释这两种说法之间的区
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 5 年前。 Improve t
////////////////////////////////////////////////////////////////////////////// // 3 construct
我是一名优秀的程序员,十分优秀!