C#EF如果表中存在行,则选择其他表从另一个表中选择

时间:2018-03-12 12:33:54

标签: c# entity-framework

我有两张牌T1T2

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

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

我尝试根据T1Name进行选择,如果它不存在,请从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 个答案:

答案 0 :(得分:0)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <p>Running test: test1</p> <p>ssfafasf</p> <p>Running test: test2</p> <p>gsgsddsh</p>T1是不同的类型(即使它们具有完全相同的属性),请考虑使用接口,或选择/投影到公共对象

答案 1 :(得分:0)

这两个查询会产生不同的类型。 您似乎需要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)

您发现此错误是因为db.T1db.T2是不同的类类型。一种选择是让T1T2使用的两个类实现相同的接口。然后,在声明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();

答案 3 :(得分:0)

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