代码之家  ›  专栏  ›  技术社区  ›  LAffair

C#EF如果表1中存在行,则选择它,否则从另一个表中选择

  •  1
  • LAffair  · 技术社区  · 8 年前

    我有两张桌子 T1 和 T2 。

    T1
    ---------
    (Name,Value)
    
    T2
    ---------
    (Name,Value)
    

    我正在试着选择 T1级 基于 Name 如果不存在,则从 T2级

    var T1Row = db.T1.AsNoTracking().Where(s => s.Name == "text1").FirstOrDefault();
    if (T1Row == null)
        T1Row = db.T2.AsNoTracking().Where(s => s.Name == "text2").FirstOrDefault();
    

    但我正在 Cannot implicitly convert type T2 to T1 。我试图将这两个查询作为一个查询进行,但我不知道如何进行。

    我是C#编程新手,所以请温柔一点

    4 回复  |  直到 8 年前
        1
  •  0
  •   Alexey Klipilin    8 年前

    这两个查询产生不同的类型。 看来你需要 DTO 课程。这样,您可以选择所需格式的数据并返回到 BLL 。

    public class NameValueDTO
    {
        public string Name { get; set; }
        public string Value{ get; set; }
    }
    
    var T1Row = db.T1.AsNoTracking().Where(s => s.Name == "text1").Select(i => new NameValueDTO { Name = i.Name, Value = i.Value }).FirstOrDefault();
    if (T1Row == null)
        T1Row = db.T2.AsNoTracking().Where(s => s.Name == "text2").Select(i => new NameValueDTO { Name = i.Name, Value = i.Value }).FirstOrDefault();
    
        2
  •  0
  •   TheGeneral    8 年前

    T1 和 T2 如果类型不同(即使它们具有完全相同的属性),请考虑使用接口,或选择/投影到公共对象中

        3
  •  0
  •   Noel    8 年前

    您看到此错误是因为 db.T1 和 db.T2 是不同的类类型。一种选择是使用您正在使用的两个类 T1 和 T2 实现相同的接口。然后,而不是使用 var ,在声明时使用接口类型 T1Row :

    IMyInterface T1Row = db.T1.AsNoTracking().Where(s => s.Name == "text1").FirstOrDefault();  //both the types in T1 and T2 need to implement this interface.
    if (T1Row == null)
        T1Row = db.T2.AsNoTracking().Where(s => s.Name == "text2").FirstOrDefault();
    
        4
  •  0
  •   Héctor Espí Hernández    8 年前

    您应该使用 Select 函数将T1或T2对象转换为包含属性的对象(nor T1,nor T2( 名称 和 价值 )你需要的回报。