Linq to Sql:在连接表时覆盖属性

时间:2011-08-25 15:09:26

标签: c# linq join

我正在尝试根据文化覆盖另一个表的值来覆盖对象。我想保留原始的对象类型。我已经尝试了不同的方法,但总是以不支持的异常或转换错误结束。

示例代码:

我想要检索的是原始对象,其中“Name”和“Text”被Contact_tls表覆盖,如

  1. 这将返回原始联系人列表,但未翻译。
  2. 这将返回我想要的翻译项目列表,但是作为匿名类型列表。
  3. 可能,但您必须重新分配所有与非语言相关的属性,如(ID,ApplicationID,PhoneNumber等)
  4. 最后一种方法,它应该是类似的(抛出错误)

    protected void Page_Load(object sender,EventArgs e) {     List Contacts = new List();     webDataContext db = new webDataContext();

    //1
    Contacts = db.Contacts.Join(
        db.Contact_tls.Where(i => i.Culture == "fr"),
        i => i.ID,
        t => t.ID,
        (i, t) => i).ToList();
    
    //2
    var linqObject = db.Contacts.Join(
        db.Contact_tls.Where(i => i.Culture == "fr"),
        i => i.ID,
        t => t.ID,
        (i, t) => new { ID = i.ID, Name = t.Name, Text = t.Text }).ToList();
    
    //3
    Contacts = db.Contacts.Join(
        db.Contact_tls.Where(i => i.Culture == "fr"),
        i => i.ID,
        t => t.ID,
        (i, t) => new Contact { ID = i.ID, Name = t.Name, Text = t.Text }).ToList();
    
    //4  
    var contacts = db.Contacts.Join(
        db.Contact_tls.Where(i => i.Culture == "fr"),
        i => i.ID,
        t => t.ID,
        (i, t) => i { Name = t.Name, Text = t.Text }).ToList();
    

    }

2 个答案:

答案 0 :(得分:1)

尝试使用每个属性的参数向Contract类添加构造函数,并将其与数字3一起使用:

Contacts = db.Contacts.Join(db.Contact_tls.Where(i => i.Culture == "fr"),
                            i => i.ID, t => t.ID,
                            (i, t) => new Contact(i.ID, t.Name, t.Text))
                      .ToList();

答案 1 :(得分:1)

我将使用Linq to Objects创建类,因此您可以按如下方式修改#2:

Contacts = db.Contacts.Join(
    db.Contact_tls.Where(i => i.Culture == "fr"),
    i => i.ID,
    t => t.ID,
    (i, t) => new { ID = i.ID, Name = t.Name, Text = t.Text })
    .AsEnumerable()
    .Select(x =>  new Contact { ID = x.ID, Name = x.Name, Text = x.Text })
    .ToList();