我对MongoDB很新,但我认为这是一个非常简单的查询。
我有一个继承自IProtein的蛋白质对象(是的,我的命名很糟糕)
public interface IProtein
{
int Count { get; set; }
DateTime Date { get; set; }
}
我想根据蛋白质对象的FirstOrDefault
字段与Date
Today
public IProtein GetProteinForDay(DateTime day)
{
var collection = _db.GetCollection<IProtein>(DB_COLLECTION);
var query = collection.AsQueryable<IProtein>()
.Where(p => p.Date == day.Date);
var protein = query.FirstOrDefault();
return protein;
}
不幸的是,我尝试使用MongoDB(有些使用Linq,有些没有使用)来尝试匹配日期的许多不同变体,我完全忘记了我对每个日期的距离。< / p>
这是我当前的代码,它返回错误Unable to determine the serialization information for the expression: p.Date
我的查询有什么问题(是的,它可能非常简单)我如何用MongoDB / Linq查询实际比较日期?
答案 0 :(得分:3)
嗯,令人失望的是.net DateTime无法与MongoDB驱动程序无缝协作。我相信支持应该融入司机。
无论如何,您需要采取一些步骤才能使.net和MongoDB协同工作。
1)使用Date
属性在接口中装饰BsonDateTimeOptions
字段,告诉MongoDB驱动程序如何序列化.net DateTime。见BsonDateTimeOptions Documentation
界面应该看起来像
public interface IProtein
{
int Count { get; set; }
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
DateTime Date { get; set; }
}
2)在GetProteinForDay
功能中,替换
var collection = _db.GetCollection<IProtein>(DB_COLLECTION);
var query = collection.AsQueryable<IProtein>()
.Where(p => p.Date == day.Date);
与
var collection = db.GetCollection<Protein>(DB_COLLECTION);
var query = collection.Find(p => p.Date == day);
请注意,我已将接口IProtein
替换为接口的具体实现,在我的情况下为Protein
。
更新:附上完整程序作为参考。
来源文件:
{
_id: ObjectID('5964ebf315c46ab80b2c20f3),
Count: 10,
Date: '2017-07-11 00:00:00.000'
}
测试程序:
using System;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
namespace mongoT
{
public interface IProtein
{
ObjectId Id { get; set; }
int Count { get; set; }
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
DateTime Date { get; set; }
}
public class Protein : IProtein
{
public ObjectId Id { get; set; }
public int Count { get; set; }
public DateTime Date { get; set; }
public override string ToString()
{
return $"{nameof(Id)}: {Id}, {nameof(Count)}: {Count}, {nameof(Date)}: {Date}";
}
}
class Program
{
private static string DB = "ProteinsDB";
private static string COLLECTION = "Proteins";
static void Main(string[] args)
{
var result = GetProteinForDay(DateTime.Now.Date);
Console.WriteLine(result);
}
public static IProtein GetProteinForDay(DateTime day)
{
var client = new MongoClient();
var db = client.GetDatabase(DB);
var collection = db.GetCollection<Protein>(COLLECTION);
var query = collection.Find(p => p.Date == day.Date);
var protein = query.FirstOrDefault();
return protein;
}
}
}