C# 列表标签){ IQueryable contentQuery=。。。 表达式谓词=PredicateBuilder.False(); foreach(标签中的标签individualTag){ Tag tagParameter=individualTag; predicate=predicate.Or(p=>p.Tags.Any(tag=>tag.Name.Equals(tagParameter.Name))); } IQueryable resultExpressions=contentQuery.Where(谓词); 返回结果pressions.ToList(); }

C# 列表标签){ IQueryable contentQuery=。。。 表达式谓词=PredicateBuilder.False(); foreach(标签中的标签individualTag){ Tag tagParameter=individualTag; predicate=predicate.Or(p=>p.Tags.Any(tag=>tag.Name.Equals(tagParameter.Name))); } IQueryable resultExpressions=contentQuery.Where(谓词); 返回结果pressions.ToList(); },c#,linq,entity-framework,lambda,many-to-many,C#,Linq,Entity Framework,Lambda,Many To Many,如果有人需要这方面的帮助,或者您希望我向您发送文件,或者只需要更多信息,请告诉我。哦,对不起。。这是通过一个普通的IList。是的。。。这正是我需要的。。。我现在遇到一个错误:>无法创建“Closure type”类型的常量值。在此上下文中仅支持基本类型(“如Int32、String和Guid”)。它来自:.Any(t=>t.Name==tag.Name)我没有使用LINQ to SQL,它是LINQ to Entities。如果我这样做,我会得到错误:无法创建“Closure type”类型的

如果有人需要这方面的帮助,或者您希望我向您发送文件,或者只需要更多信息,请告诉我。

哦,对不起。。这是通过一个普通的IList。是的。。。这正是我需要的。。。我现在遇到一个错误:>无法创建“Closure type”类型的常量值。在此上下文中仅支持基本类型(“如Int32、String和Guid”)。它来自:.Any(t=>t.Name==tag.Name)我没有使用LINQ to SQL,它是LINQ to Entities。如果我这样做,我会得到错误:无法创建“Closure type”类型的常量值。在此上下文中仅支持基元类型('如Int32、String和Guid')。这类帮助。。。但是我仍然没有从中得到一个有效的解决方案:(你可以使用pastebin.com或gist.github.com来粘贴你的ExpressionVisitor的黑客版本,这个类可能对某些人有用:)我可以得到代码的副本吗。你可以发电子邮件给我mikemurf22@hotmail.com. 我找不到你的电子邮件。
tags.Select(testTag => testTag.Name)
contentQuery.Where(
    content => content.Tags.Any(tag => tag.Name == "blah")
);
contentQuery.Where(
    content => content.Tags.Any(tag => tags.Any(t => t.Name == tag.Name))
);
IEnumerable<Tag> otherTags;
...
var query = from content in contentQuery
            where content.Tags.Intersection(otherTags).Any()
            select content;
var filter = BuildContainsExpression<Element, string>(e => e.Name, tags.Select(t => t.Name));
var query = source.Where(e => e.NestedValues.Any(filter));
return sequence.ToReadOnlyCollection<Expression>();
return sequence.AsReadOnly();
public class ParameterRebinder : ExpressionVisitor {
        private readonly Dictionary<ParameterExpression, ParameterExpression> map;

        public ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map) {
            this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
        }

        public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp) {
            return new ParameterRebinder(map).Visit(exp);
        }

        internal override Expression VisitParameter(ParameterExpression p) {
            ParameterExpression replacement;
            if (map.TryGetValue(p, out replacement)) {
                p = replacement;
            }
            return base.VisitParameter(p);
        }
    }
public static class ExpressionExtensions {
        public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge) {
            // build parameter map (from parameters of second to parameters of first)
            var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);

            // replace parameters in the second lambda expression with parameters from the first
            var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);

            // apply composition of lambda expression bodies to parameters from the first expression 
            return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second) {
            return first.Compose(second, Expression.And);
        }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second) {
            return first.Compose(second, Expression.Or);
        }
    }
public static class PredicateBuilder {
    public static Expression<Func<T, bool>> True<T>() { return f => true; }
    public static Expression<Func<T, bool>> False<T>() { return f => false; }

}
    public static IList<Content> GetAllContentByTags(IList<Tag> tags) {
        IQueryable<Content> contentQuery = ...

        Expression<Func<Content, bool>> predicate = PredicateBuilder.False<Content>();

        foreach (Tag individualTag in tags) {
            Tag tagParameter = individualTag;
            predicate = predicate.Or(p => p.Tags.Any(tag => tag.Name.Equals(tagParameter.Name)));
        }

        IQueryable<Content> resultExpressions = contentQuery.Where(predicate);

        return resultExpressions.ToList();
    }