5

我的实体NewsItem有一个可为空的外键属性:LibraryID类型为int?

我的问题是当我查询该属性并将其与除 之外的任何值进行比较时null,我得到了异常。

最初我的代码是:

int? lid = ...
var results = context.NewsItems
    .Where(n => n.LibraryID == lid);

但它根本没有给我任何结果,不管是什么lid

所以,我尝试了:

var results = context.NewsItems
    .Where(n => n.LibraryID.Equals(lid));

给出例外:

无法创建“System.Object”类型的常量值。此上下文仅支持原始类型或枚举类型。

然后我尝试了:

var results = context.NewsItems
    .Where(n => lid.Equals(n.LibraryID));

并得到:

无法将类型“System.Nullable`1”转换为类型“System.Object”。LINQ to Entities 仅支持转换 EDM 基元或枚举类型。

还有这个:

var results = context.NewsItems
    .Where(n => object.Equals(lid, n.LibraryID));

给出与最后一个相同的例外。

现在我很绝望,所以我试图使事情复杂化(就像其他论坛建议的那样,例如这里):

var results = context.NewsItems
    .Where(n => (lid == null ? n.LibraryID == null : n.LibraryID == lid));

但仍然得到同样的例外。

那么......任何简单的解决方法?

4

5 回答 5

2

怎么样

var results = context.NewsItems
    .Where(n => lid.HasValue ? lid.Value == n.LibraryId.Value : (!n.LibraryId.HasValue) );
于 2013-03-14T04:00:15.793 回答
1

嗯,第一个片段应该可以工作。我已经多次使用过这样的空值。我要做的第一件事是进行健全性检查,以确保LibraryID它是真的int?,不是long?或相似的。

除此之外,你可以试试这个:

var results = context.NewsItems
    .Where(n => (lid.HasValue ? n.LibraryID == lid.Value : !n.LibraryID.HasValue));

或避免?:在查询内:

var results = lid.HasValue 
    ? context.NewsItems.Where(n => n.LibraryID == lid.Value)
    : context.NewsItems.Where(n => !n.LibraryID.HasValue);
于 2013-03-14T02:20:55.237 回答
0

根据 MSDN 文档(我终于找到了), .Where() 只会过滤您的收藏。如果您想查看是否有实际结果,请通过使用 .ToList()、GetEnumerator 延迟执行过滤后的查询或使用 foreach 枚举集合来解决;

该方法是通过使用延迟执行来实现的。立即返回值是一个存储执行操作所需的所有信息的对象。在通过直接调用其 GetEnumerator 方法或使用 Visual C# 中的 foreach 或 Visual Basic 中的 For Each 枚举对象之前,不会执行此方法表示的查询。

http://msdn.microsoft.com/en-us/library/bb534803.aspx

int? lid = ...
var results = context.NewsItems
    .Where(n => n.LibraryID == lid).ToList();
于 2013-03-14T02:15:35.793 回答
0
var results = context.NewsItems
    .Where(n => n.LibraryID.HasValue && n.LibraryID.Value == lid.Value );

编辑:

以前的过滤器基于我的理解,即您希望过滤到具有特定值的整体。更新将过滤为空或值。

   var results = context.NewsItems
        .Where(n => !n.LibraryID.HasValue || n.LibraryID.Value == lid.Value );
于 2013-03-14T03:02:47.630 回答
0

似乎 EF 没有找到正确的运算符重载。因此,如果你设置它会产生错误的结果lid = null

通过添加到您的查询中使用 linq 到对象AsEnumerable(),一切都很好:

var results = context.NewsItems.AsEnumeryble().Where(n => n.LibraryID == lid);
于 2013-03-14T06:29:52.523 回答