0

我有以下实体的基于代码的上下文:

public class City : IEquatable<City>
{

    public City()
    {
        Posts = new List<Post>();
    }

    public City(string cityName) : this()
    {
        Name = cityName;
    }

    public virtual ICollection<Post> Posts { get; private set; }

    public int Id { get; set; }

    public string Name { get; private set; }

    protected string  LoweredName 
    {
        get { return Name.ToLower(CultureInfo.CurrentCulture); }
    }

    public override bool Equals(object obj)
    {
        bool equals = false;
        var city = obj as City;
        if (city != null)
            equals = Equals(city);
        return equals;
    }

    public override int GetHashCode()
    {
        int idHash = Id.GetHashCode();
        int nameHash = LoweredName.GetHashCode();

        var hashCode = idHash ^ nameHash;
        return hashCode;
    }

    public bool Equals(City other)
    {
        return Id == other.Id && LoweredName == other.Name.ToLower(CultureInfo.CurrentCulture);
    }
}
public class Post : IEquatable<Post>
{
    public Post()
    {
        Addresses = new List<PostalAddress>();
    }

    public virtual ICollection<PostalAddress> Addresses { get; private set; }
    public virtual City City { get; set; }

    public int Id { get; set; }

    public string ZipCode { get; set; }
    protected string LoweredZipCode { get { return ZipCode.ToLower(CultureInfo.CurrentCulture); } }

    public bool Equals(Post other)
    {

        return Id == other.Id && City.Equals(other.City) && LoweredZipCode == other.ZipCode.ToLower(CultureInfo.CurrentCulture);
    }
}

DbContext 在方法 OnModelCreating 中定义了这些实体:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    modelBuilder.Configurations.Add(new CityMap());
    modelBuilder.Configurations.Add(new PostMap());
}

public class CityMap : EntityTypeConfiguration<City>
{
    public CityMap()
    {
        // Primary Key
        HasKey(t => t.Id);

        // Properties
        // Table & Column Mappings
        ToTable("City");
        Property(t => t.Id).HasColumnName("Id");
        Property(t => t.Name)
            .HasColumnName("Name")
            .HasMaxLength(450);
    }
}
public class PostMap : EntityTypeConfiguration<Post>
{
    public PostMap()
    {
        // Primary Key
        HasKey(t => t.Id);

        // Properties
        // Table & Column Mappings
        ToTable("Post");
        Property(t => t.Id)
            .HasColumnName("Id");
        Property(t => t.ZipCode)
            .HasColumnName("ZipCode")
            .HasMaxLength(450);

        // Relationships
        HasRequired(t => t.City)
            .WithMany(t => t.Posts)
            .Map(map => map.MapKey("CityId"));
    }
}

我已经将一些数据作为 POCO 对象读取并将它们插入到 List 集合中

public class PostImportObject : IEquatable<PostImportObject>
    {

        private string _city;
        private string _loweredCity;

        public string City
        {
            get { return _city; }
            set
            {
                _city = value.CapitalizeFirstLetter();
                _loweredCity = value.ToLower(CultureInfo.CurrentCulture);
            }
        }

        public string ZipCode
        {
            get { return _zipValue; }
            set { _zipValue = value.ToLower(CultureInfo.CurrentCulture); }
        }


        protected string LoweredCity
        {
            get { return _loweredCity; }
        }

        public override bool Equals(object obj)
        {
            bool equals = false;
            var postImport = obj as PostImportObject;
            if (postImport != null)
            {
                equals = Equals(postImport);
            }
            return equals;
        }

        public override int GetHashCode()
        {
            int ziphash = ZipCode.GetHashCode();
            int cityHash = LoweredCity.GetHashCode();

            var hashCode = ziphash ^ cityHash;
            return hashCode;
        }

        public bool Equals(PostImportObject other)
        {
            bool equals = _loweredCity == other.City.ToLower(CultureInfo.CurrentCulture) && ZipCode == other.ZipCode;
            return equals;
        }
    }

如果我也在导入列表和数据库中查询数据,我的以下查询将返回相同的异常:

using(var db = new DbContext())
{
    var query1 = from post2 in db.Posts.Include("City")
                                    join mergedPost in mergedPosts on new PostImportObject() {City = post2.City.Name, ZipCode = post2.ZipCode} equals new PostImportObject() {City = mergedPost.City, ZipCode = mergedPost.ZipCode} into joinedPosts
                                    from joinedPost in joinedPosts.DefaultIfEmpty()
                                    where joinedPosts==null
                                    select post2;

            var query2= from city1 in db.Cities
                            join postImportObject in mergedPosts on city1.Name equals postImportObject.City
                            join post1 in db.Posts on city1 equals post1.City
                            select post1;
}

在查询 query1 或 query2 的 Any() 方法时,我会得到以下异常: 索引(从零开始)必须大于或等于零且小于参数列表的大小

很抱歉,我创建了另一个主题相同的主题,但我在其他主题中没有找到解决我的问题的方法。

4

1 回答 1

1

查看堆栈跟踪,我猜ELinq_UnsupportedConstant资源的翻译版本有问题。此错误消息的英文版本是:无法创建类型为“{0}”的常量值。此上下文仅支持原始类型 ('{1}')。

我认为你有两个问题:

  1. 对于 a join,复合键需要是匿名类型;你不能用你的PostImportObject作为加入键query1

  2. 您不能将数据库表连接到本地列表;

我认为您需要.AsEnumerable()先将整个列表拉入内存,然后才能加入本地列表:

var query = from post in context.Posts.Include(p => p.City).AsEnumerable()
            join mergedPost in mergedPosts 
               on new { City = post.City.Name, post.ZipCode } 
               equals new { mergedPost.City, mergedPost.ZipCode } 
               into joinedPosts
           from joinedPost in joinedPosts.DefaultIfEmpty()
           where joinedPost == null
           select post;
于 2012-12-18T21:15:07.893 回答