- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 Entity Framework 还很陌生(目前使用 v4.1 开发),所以我可能会以完全错误的方式解决这个问题,所以我欢迎任何指导。
我目前有两个类:Item,它只有几个简单的字段,而 FavouriteItem 包含对项目和用户的引用(但用户关系是'与讨论有关)。该项目有一个可为 null 的 DateVisible 字段,我将其用作标志以指示是否应显示该项目。
为了获得可见项目的列表,我使用了一个简单的查询:
var items = itemRepository
.QueryAll()
.Where(i => i.DateVisible <= DateTime.Now)
显然 QueryAll 返回一个 IQueryable。这是一个简单的示例,因为条件稍微复杂一些,但它证明了我的问题。
接下来,如果我想返回可见项目的收藏夹列表,那么我可以执行类似的查询:
var favourites= favouriteRepository
.QueryAll()
.Where(f => f.Item.DateVisible <= DateTime.Now)
这很好用。但是,代码是重复的。所以我想做的是以某种方式使这段代码更集中——因为我要添加一个 FollowingItem 类,它又具有一个 Item 属性,所以我不得不重复代码再次 - 不好。
我开始为项目列表创建一个表达式,效果很好:
public static Expression<Func<Item, bool>> IsVisibleExpression<Item>()
{
return item => item.DateVisible != null &&
item.DateVisible <= DateTime.Now;
}
public static IQueryable<Item> WhereVisible<Item>(this IQueryable<Item> queryable)
{
return queryable.Where(Item.IsVisibleExpression());
}
var items = itemRepository
.QueryAll()
.WhereVisible()
同样,我可以为每个类创建这些表达式:
public static Expression<Func<FavouriteItem, bool>> IsVisibleExpression<FavouriteItem>()
{
return favourite => favourite.Item.DateVisible != null &&
favourite.Item.DateVisible <= DateTime.Now;
}
但这又只是重复了代码。有没有办法在它们之间使用相同的代码。我知道我可以在 itemRepository.QueryAll().WhereVisible()
上做一个连接,但是有没有一种方法可以做到这一点而不需要在任何地方都这样做?
更新:我尝试为这些类创建一个接口(interface):
public interface IEntityWithItem
{
Item Item { get; set; }
}
并为它创建一个表达式:
public static IQueryable<TEntity> WhereItemVisible<TEntity>(this IQueryable<TEntity> queryable) where TEntity : IEntityWithItem
{
return queryable.Where(ui => ui.Item.DateVisibleFrom != null &&
ui.Item.DateVisibleFrom.Value <= DateTime.Now);
}
我从中调用:
// Get the favourites
var favourites = favouriteItemRepository.QueryAll()
.WhereItemVisible()
.Where(favourite => favourite.UserId == user.Id);
但它给出错误:“无法将类型‘FavouriteItem’转换为类型‘IEntityWithItem’。LINQ to Entities 仅支持转换实体数据模型基元类型。”
最佳答案
据我所知,没有简单的方法可以实现这一点,但是请看一下 PredicateBuilder,它确实解决了其中的一些问题:http://www.albahari.com/nutshell/predicatebuilder.aspx .
基本思想是您定义具有公共(public)属性的接口(interface),这允许您定义受限于该接口(interface)的通用表达式。
首先定义这些接口(interface):
public interface IHaveItem
{
Item Item {get;}
}
public interface IDateVisible
{
DateTime? DateVisible {get;}
}
这将允许您以通用方式编写查询表达式,至少获得一些重用:
public static Expression<Func<T,bool>> IsVisible<T>(DateTime now)
where T:IHaveItem
{
return x => x.Item.DateVisible != null &&
x.Item.DateVisible < now;
}
但是,您仍然无法轻松实现 x.DateVisible
和 x.Item.DateVisible
等表达式之间的重用。
更新:事实证明,在生成的表达式树中添加了“不必要的”转换操作,然后在转换为 SQL 时 Entity Framework 提供程序不支持这些操作。
您可以应用与 this question 中类似的技巧“手动”删除这些不必要的转换操作。虽然恕我直言,但变得有点毛茸茸......
关于c# - Entity Framework - 类似属性的表达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13376326/
学习SQL。有一个简单的带有字段标题的桌面游戏。我想根据标题进行搜索。如果我有一款名为 Age of Empires III: Dynasties 的游戏,并且我使用 LIKE 和参数 Age of
我正在尝试为以下数据结构创建镜头。我正在使用lens-family . data Tree = Tree { _text :: String, _subtrees ::
我发现很难理解这一点。比如说,在 Python 中,如果我想要一个根据用户输入在循环中修改的列表,我会有这样的内容: def do_something(): x = [] while(
我有一个像这样的 mysql 查询 SELECT group_name FROM t_groups WHERE group_name LIKE '%PCB%'; 结果是 group_name ----
我的数据库表中有超过一百万条记录。当我使用like时非常慢,当我使用match against时他们丢失了一些记录。 我创建帮助表: 标签列表 tag_id tag_name tag_rel_me
我在我的一个 Java 项目中使用 JXBrowser 来简单显示 googlemaps 网页,以便我可以在那里跟踪路线,但最近我想改进该项目,但我的问题是 JXBrowser 的许可证过期(只有一个
小问题:如何将 mysql_escape_string 变量包含在 like 子句中? "SELECT * FROM table WHERE name LIKE '%". %s . "%'" 或
我尝试使用几个jquery消息插件,例如alertify . 但我注意到的主要事情是系统消息框会停止后台功能,直到用户响应。其他插件没有此功能。 有没有办法将此功能添加到 jquery 插件中?可以扩
我是 Ruby 新手。我过去使用过 shell。我正在将 shell 程序转换为 ruby。我有以下命令 cmd="cat -n " + infile + " | grep '127.0.0.1
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
当我研究 Rust 时,我试图编写一个 Rust 函数来查看任何可迭代的字符串。 我最初的尝试是 fn example_1(iter: impl Iterator); fn example_2(ite
我必须在我的项目中使用代码拆分。但无论如何,第一次初始下载有一些代码。 现在我想向最终用户展示代码下载(.cache.html - 或其他代码拆分)的进度,例如 gmail 启动进度。 请你帮帮我。
我今天找到了一个错误,它最终是由我代码中的以下片段引起的(我试图在列表中仅过滤“PRIMARY KEY”约束): (filter #(= (% :constraint_type "PRIMARY KE
我正在尝试在关键字段上实现检查约束。关键字段由 3 个字符的前缀组成,然后附加数字字符(可以手动提供,但默认是从序列中获取整数值,然后将其转换为 nvarchar)。关键字段定义为 nvarhcar(
我正在尝试使用以下方式创建 List 实例: List listOne = new ArrayList(); List listTwo = new ArrayList(){}; List listTh
我过去曾为 iOS 开发过,最近转向了 mac 开发。我开始了一个“感受”事物的项目,但遇到了一个问题。我试图创建一个 NSTableView 来显示多个项目,包括一个标签、一个 2 UIImageV
我正在尝试编写一个查询,该查询将返回哪些主机缺少某个软件: Host Software A Title1 A
AFAIK,在三种情况下别名是可以的 仅限定符或符号不同的类型可以互为别名。 struct 或 union 类型可以为包含在其中的类型设置别名。 将 T* 转换为 char* 是可以的。 (不允许相反
\s 似乎不适用于 sed 's/[\s]\+//' tempfile 当它为工作时 sed 's/[ ]\+//' tempfile 我正在尝试删除由于命令而出现在每行开头的空格: nl -s ')
我正在使用 ocamlgraph 在 ocaml 中编写程序,并想知道是否要将其移植到 F# 我有哪些选择?谢谢。 最佳答案 QuickGraph .Net 最完整的图形库之一 关于F# 图形库(类似
我是一名优秀的程序员,十分优秀!