gpt4 book ai didi

c# - LINQ to Entities 和多态性

转载 作者:行者123 更新时间:2023-11-30 12:23:08 24 4
gpt4 key购买 nike

假设我有一个简单的模型:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com