使用First()和FirstOrDefault()时Linq错误

时间:2014-01-06 09:36:51

标签: c# linq dynamic

我尝试将此查询与linq:

一起使用
myQuery= myQuery.Where(c => c.RelatedEntity
                             .FirstOrDefault()
                             .MyStringProperty
                             .Contains(myString));

但它说不可能使用First(),我必须考虑使用FirstOrDefault()。但如果我使用第一个或默认值,我会收到其他错误System.Data.EntityCommandCompilationException

我想要的是找到其他MainEntities,其中string属性中的相关实体包含用户给出的参数的字符串。

感谢。

编辑:我添加了更多信息。

我的存储库的代码是:

using(catalogoEntitiesSQLiteEF5 miDBContext = new catalogoEntitiesSQLiteEF5())
{
    IQueryable<Contenidos> miConsulta = miDBContext.Contenidos.Include(c=>c.Videos.Select(v=>v.GenerosVideos));

    if (paramVideos.Titulo != null)
    {
        miConsulta = miConsulta.Where(c => c.Videos.First().Titulo.Contains(paramVideos.Titulo));
    }
    return miConsulta.ToList<Contenidos>();
}

POCO实体:

public partial class Contenidos
{
    public Contenidos()
    {
        this.Ficheros = new HashSet<Ficheros>();
        this.Videos = new HashSet<Videos>();
    }

    public long IDContenido { get; set; }
    public long IDTipoContenido { get; set; }
    public string Observaciones { get; set; }

    public virtual TiposContenidos TiposContenidos { get; set; }
    public virtual ICollection<Ficheros> Ficheros { get; set; }
    public virtual ICollection<Videos> Videos { get; set; }
}

public partial class GenerosVideos
{
    public GenerosVideos()
    {
        this.Videos = new HashSet<Videos>();
    }

    public long IDGenero { get; set; }
    public string GeneroVideo { get; set; }

    public virtual ICollection<Videos> Videos { get; set; }
}

public partial class Videos
{
    public Videos()
    {
        this.Series = new HashSet<Series>();
        this.GenerosVideos = new HashSet<GenerosVideos>();
    }

    public long IDVideo { get; set; }
    public long IDContenido { get; set; }
    public long IDTipoVideo { get; set; }
    public string Titulo { get; set; }
    public string TituloOriginal { get; set; }
    public Nullable<long> Duracion { get; set; }
    public Nullable<long> Año { get; set; }
    public bool Favorito { get; set; }
    public bool Pendiente { get; set; }

    public virtual Contenidos Contenidos { get; set; }
    public virtual ICollection<Series> Series { get; set; }
    public virtual TiposVideos TiposVideos { get; set; }
    public virtual ICollection<GenerosVideos> GenerosVideos { get; set; }
}

3 个答案:

答案 0 :(得分:1)

Any()应该有效:

myQuery = myQyuery.Where(c => c.RelatedEntity
    .Any(x => x.MyStringProperty.Contains(myString)));

答案 1 :(得分:1)

这个怎么样:

myQuery= myQuery.Where(c => c.RelatedEntity.FirstOrDefault(x => x.MyStringProperty.Contains(myString));

答案 2 :(得分:1)

如果您的列表中不包含任何元素,FirstOrDefault()将返回null,这将导致NullReferenceException。 为避免使用:

myQuery= myQuery.Where(c => c.RelatedEntity
                             .FirstOrDefault(x => x.MyStringProperty
                                                   .Contains(myString)) != null);

另一个问题是您对Include()的使用。正如James所指出的,它不支持子查询。尝试改变你的:

IQueryable<Contenidos> miConsulta =
    miDBContext.Contenidos.Include(c=>c.Videos.Select(v=>v.GenerosVideos));

类似于:

IQueryable<Contenidos> miConsulta =
       miDBContext.Contenidos.Include(x => x.Videos)
               .Select(x => new {
                    GenerosVideos = x.Videos.Select(v=>v.GenerosVideos).ToList()
               });