【问题标题】:Linq query leading to invalid column name SqlExceptionLinq 查询导致无效的列名 SqlException
【发布时间】:2017-05-20 11:40:33
【问题描述】:

ASPNET MVC5 网络应用,Visual Studio 2015

网站是语言本地化的,所以我需要根据文化参数获取本地化的类别。

category_trans 表用于提供类别名称翻译,而ISO_Languages 用于接收文化代码参数并将其相关 id 传递给category_trans

型号:

public partial class Product
{
    public int? ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int CategoryID { get; set; }
    public virtual category_trans category_trans { get; set; }
}

public partial class Category
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int? ParentID { get; set; }
    public bool IsDeleted { get; set; }
}

public class category_trans
{
    [Key]
    [Column(Order = 1)]
    public int category_id { get; set; }
    [Key]
    [Column(Order = 2)]
    public int language_id { get; set; }
    public string name { get; set; }
}

public class ISO_Languages
{
    public int ID { get; set; }
    public string code { get; set; }
    public bool IsEnabled { get; set; }
    public string name_en { get; set; }
    public string name_fr { get; set; }
    public string name_it { get; set; }
    public string name_de { get; set; }
    public string name_es { get; set; }
}

public static IQueryable<Product> ActiveProductsPerUser(BaseContext db, string userid, string culture)
    {
        return from p in db.Products
               from ct in db.category_trans
               from l in db.ISO_Languages
               where (ct.category_id == p.CategoryID
               && ct.language_id == l.ID
               && l.code.Substring(0, 2) == culture)
               select p;
    }

导致错误:

System.Data.SqlClient.SqlException:列名“category_trans_category_id”无效。列名“category_trans_language_id”无效。在 System.Data.SqlClient.SqlCommand.c.b__174_0(Task1 result)
in System.Threading.Tasks.ContinuationResultTaskFromResultTask
2.InnerInvoke()
在 System.Threading.Tasks.Task.Execute()

另请注意,我将预期结果传递给另一种排序和分页方法,因此接受IQueryable 作为输入(没有IEnumerable)。

【问题讨论】:

  • 代码优先还是数据库优先?
  • 你好。先写代码。

标签: sql asp.net-mvc linq


【解决方案1】:

试试这个;

public static IQueryable<Product> ActiveProductsPerUser(BaseContext db, string userid, string culture)
    {
        var query = (from p in db.Products
                     join ct in db.category_trans
                     on p.CategoryID equals ct.category_id
                     join l in db.ISO_Languages
                     on ct.language_id equals l.ID
                     where l.code.Substring(0, 2) == culture)
                     select p).ToList();

        return query;
    }

【讨论】:

  • 该错误是由最近在产品模型类中添加的属性“public virtual category_trans category_trans { get; set; }”引起的。我不明白为什么。无论如何,我仍然需要与产品一起检索类别本地化名称。我认为这是更好的方法,但它不起作用。
  • 我在 Product 模型中有其他虚拟属性(例如 public virtual Category Category { get; set; } 和 public virtual AspNetUsers User { get; set; }),它们不会引起任何问题。我能注意到 virtual category_trans 的唯一区别是它有一个复合 PK(如模型所示)。可能是错误原因吗?
  • 是的,你必须写 public virtual category_trans 而不是 virtual category_trans。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 2017-09-24
  • 2013-07-18
相关资源
最近更新 更多