LINQ查询不返回子字段

时间:2017-06-07 08:01:35

标签: c# sql visual-studio linq

我认为我变得愚蠢,因为我无法让我的LINQ查询按预期工作。我有一个类与其他类有3个关系。

这是主要类

[Table(Name = "scanResult")]
public class SniffResult
{
    public SniffResult()
    {

    }

    public SniffResult(Address address)
    {
        this.address = address;
    }

    private int _pk_SniffResult;

    [Column(IsPrimaryKey = true, IsDbGenerated = true, Storage = "_pk_SniffResult", Name ="pk_scanResult")]
    public int pk_SniffResult { get { return _pk_SniffResult; } set { this._pk_SniffResult = value; } }

    private int _fk_scan;

    [Column(Storage = "_fk_scan", Name = "scan")]
    public int fk_scan { get { return _fk_scan; } set { this._fk_scan = value; } }

    private Scan _scan;

    [Association(Storage = "_scan", IsForeignKey = true, ThisKey = "fk_scan", OtherKey = "pk_scan")]
    public Scan scan { get { return _scan; } set { this._scan = value; } }

    private int _fk_address;

    [Column(Storage = "_fk_address", Name = "address")]
    public int fk_adress { get { return _fk_address; } set { this._fk_address = value; } }

    private Address _address;

    [Association(Storage ="_address", IsForeignKey = true, ThisKey = "fk_adress", OtherKey = "pk_address")]
    public Address address { get { return _address; } set { this._address = value; } }

    private string _rawResult;

    [Column(Storage = "_rawResult", Name = "raw")]
    public string rawResult { get { return _rawResult; } set { this._rawResult = value; } }

    private int _code = -5;

    [Column(Storage = "_code")]
    public int code { get { return _code; } set { this._code = value; } }

    private DateTime _scanDate = DateTime.Now;

    [Column(Storage = "_scanDate")]
    public DateTime scanDate { get { return _scanDate; } set { this._scanDate = value; } }

    private int? _fk_proxy;

    [Column(Storage = "_fk_proxy", Name = "usedProxy", CanBeNull = true)]
    public int? fk_proxy { get { return _fk_proxy; } set { this._fk_proxy = value; } }

    private ProxyData _usedProxy;

    [Association(Storage = "_usedProxy", IsForeignKey = true, ThisKey = "fk_proxy", OtherKey = "pk_proxy")]
    public ProxyData usedProxy { get { return _usedProxy; } set { this._usedProxy = value; } }

    public string message { get; set; } = "";

    public bool availability { get; set; }

    public int planCode { get; set; } 

    public string planning { get; set; }

    public override string ToString()
    {
        return string.Format("availability={0}, code={1}, message={2}", availability, code, message);
    }
}

这是子课程之一

[Table(Name = "address")]
public class Address
{
    private int _pk_address;

    [Column(IsPrimaryKey = true, IsDbGenerated = true, Storage = "_pk_address")]
    public int pk_address { get { return _pk_address; } set { this._pk_address = value; } }

    private string _provId;

    [Column(Storage = "_provId")]
    public string provId { get { return _provId; } set { this._provId = value; } }

    private string _zipcode;

    [Column(Storage = "_zipcode")]
    public string zipcode { get { return _zipcode; } set { this._zipcode = value; } }

    private int _houseNumber;

    [Column(Storage = "_houseNumber")]
    public int houseNumber { get { return _houseNumber; } set { this._houseNumber = value; } }

    private string _addressAddition;

    [Column(Storage = "_addressAddition")]
    public string addressAddition { get { return _addressAddition; } set { this._addressAddition = value; } }

    public string ToAddresString()
    {
        return string.Format("{0} {1}{2}", this.provId, zipcode, houseNumber, addressAddition);
    }

    public override string ToString()
    {
        return string.Format("{0}:\t{1}\t{2}{3}", this.provId, zipcode, houseNumber, addressAddition);
    }
}

我想获得包含相关字段的SniffResult。但它们都是空的。这是我使用的代码:

         SniffDAO dao = new SniffDAO();

         var test =  from sr in dao.SniffResults
                    where sr.fk_scan == 3
                    select sr;

        foreach (var one in test)
        {
            Console.WriteLine(one.pk_SniffResult);
            Console.WriteLine(one.address);
        } 

one.address给我一个null,我做错了什么?

这是Dao类

public class SniffDAO
{
    private string currentDir;
    private DataContext db;
    public Table<Scan> Scans { get; set; }
    public Table<SniffResult> SniffResults { get; set; }
    public Table<Address> Addresses { get; set; }

    public SniffDAO()
    {
        db = new DataContext(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=********;Integrated Security=True;Asynchronous Processing=True");

        db.ObjectTrackingEnabled = true;

        Scans = db.GetTable<Scan>();
        SniffResults = db.GetTable<SniffResult>();
        Addresses = db.GetTable<Address>();

        currentDir = Directory.GetCurrentDirectory();
    }

    public void save()
    {
        db.SubmitChanges();
    }

}

2 个答案:

答案 0 :(得分:2)

您需要包含以下相关实体:

    SniffDAO dao = new SniffDAO();

    var test = dao.SniffResults.Include(x=>x.address).Where(sr.fk_scan == 3);

    foreach (var one in test)
    {
        Console.WriteLine(one.pk_SniffResult);
        Console.WriteLine(one.address);
    } 

答案 1 :(得分:1)

感谢@Kris我找到了解决方案。我现在用:

        DataLoadOptions dlo = new DataLoadOptions();
        dlo.LoadWith<SniffResult>(sr => sr.address);
        dlo.LoadWith<SniffResult>(sr => sr.usedProxy);
        dlo.LoadWith<SniffResult>(sr => sr.scan);

        db.LoadOptions = dlo; //db is the DataContext

有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/bb548760(v=vs.110).aspx