- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个简单的模型:
public class Movie
{
public int ID { get; set; }
public string Name { get; set; }
}
还有一个 DbContext:
public class MoviesContext : DbContext
{
...
public DbSet<Movie> Movies { get; set; }
}
此外,我在 MoviesContext 类中有一个方法可以像这样按子字符串过滤电影:
return Movies.Where(m => m.Name.Contains(filterString)).Select(m => m);
现在假设我想添加一个新模型,比如说:
public class Person
{
public int ID { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public string FullName { get { return FirstName + (MiddleName?.Length > 0 ? $" {MiddleName}" : "") + $" {LastName}"; } }
}
我还想按名称(即 FullName)过滤人员 (DbSet Persons)。我想要 DRY,所以最好概括 MoviesContext 的过滤方法。而且,重要的是,我想在数据库级别进行过滤。所以我必须处理 LINQ for Entities。
如果不是这个,任务很简单。我可以使用一个抽象类并添加一个执行“包含子字符串”逻辑的虚拟方法。或者,我可以使用一个接口(interface)。不幸的是,由于 LINQ for Entities,我不能使用 FullName 属性(这不方便但可以忍受)并且我不能写这样的东西:
return dbset.Where(ent => ent.NameContains(filterString)).Select(ent => ent);
那么,如何解决这个问题呢?我找到了一些解决方案(差点把我的脑袋弄坏了),但我对此不是很满意。我会单独发布我的解决方案,但我希望有更优雅的解决方案。
最佳答案
仔细阅读你的代码,而不是你的 NameFilterable
抽象类,你能不能做这样的事情:
public interface IHasPredicateGetter<T> {
[NotNull] Expression<Func<T, bool>> GetPredicateFromString([NotNull] string pValue);
}
public class Movie : IHasPredicateGetter<Movie> {
public int ID { get; set; }
public string Name { get; set; }
public Expression<Func<Movie, bool>> GetPredicateFromString(string pValue) {
return m => m.Name.Contains(pValue);
}
}
例如,这可以防止您需要强制转换。很难理解你在这里想做什么,所以我不确定这是否是全部。您仍然坚持使用可能应该是静态方法的实例方法,但它不能以其他方式实现接口(interface)。
关于c# - LINQ to Entities 和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38129210/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!