繁体   English   中英

c# 实体框架 - 查询 2 个链接列

[英]c# Entity Framework - Querying 2 Linked Columns

我在这些方面设置了一些实体:

public class Person
{
    public int PersonId {get;set;}
    public string FirstName {get;set;}
    public string LastName {get;set;}
}

public class Event
{
    public int EventId {get;set;}
    public int PersonId {get;set;}
    public virtual Person {get;set;}
}

我还有一个从我的存储库中提取的自定义方法

public IQueryable<T> FindByCondition(Expression<Func<T, bool>> expression)
{
    return this.RepositoryContext.Set<T>().Where(expression).AsNoTracking();
}

我还有一个助手可以从 GET 查询中收集查询参数。 例如,我的事件参数助手可能有一个类似的属性

public string EventCreator {get;set;}

示例 URL 为 ..../event?eventcreator=tom

我遇到的麻烦是我希望 EventCreator 与此人的全名相匹配。 如果我这样做我的查询,它的工作原理:

_repoWrapper.Event.FindByCondition(p => p.Person.FirstName.Contains(filterModel.EventCreator ?? String.Empty, StringComparison.InvariantCultureIgnoreCase))
.Where(p => p.Person.LastName.Contains(filterModel.EventCreator ?? String.Empty, StringComparison.InvariantCultureIgnoreCase))

但是,很明显,如果查询包含第一个 AND 姓氏的部分或全部,这将不匹配。

我想做的是这样的事情,但它不想工作

_repoWrapper.Event.FindByCondition(p => String.Format("{0}{1}", p.Person.FirstName, p.Person.LastName).Contains(filterModel.EventCreator ?? String.Empty, StringComparison.InvariantCultureIgnoreCase))

我收到如下错误:

        Message "The LINQ expression 'DbSet<Event>\r\n    .Join(\r\n        outer: DbSet<Person>, \r\n        inner: t => EF.Property<Nullable<int>>(t, \"PersonId\"), \r\n        outerKeySelector: a => EF.Property<Nullable<int>>(a, \"PersonId\"), \r\n        innerKeySelector: (o, i) => new TransparentIdentifier<Event, Person>(\r\n            Outer = o, \r\n            Inner = i\r\n        ))\r\n    .Where(t => string.Format(\r\n        format: \"{0}{1}\", \r\n        arg0: t.Inner.FirstName, \r\n        arg1: t.Inner.LastName).Contains(\r\n        value: __p_0, \r\n        comparisonType: InvariantCultureIgnoreCase))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information."   string

有谁知道这里发生了什么?

在当前状态下string.Format无法通过 EF Core 转换为 SQL。 Contains功能区分大小写,转换StringComparison.InvariantCultureIgnoreCase取决于提供程序的成熟度。 但是有EF.Functions.Like可用于此类任务。

省略您的存储库过滤器:

var query = _repoWrapper.Event.FindByCondition(p => true);

if (!string.IsNullOrEmpty(filterModel.EventCreator))
   query = query.Where(p => 
        EF.Functions.Like(p.Person.FirstName, $"%{filterModel.EventCreator}%")
     || EF.Functions.Like(p.Person.LastName,  $"%{filterModel.EventCreator}%"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM