簡體   English   中英

當結果為null時,精簡程序多映射IEnumerable列表的默認值

[英]Default value for dapper multi mapped IEnumerable list when result is null

我有以下代碼通過存儲過程查詢數據庫。 ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable(); 不為空,返回值可以; 但是我找不到一種通過Dapper / linq使用集合類型處理null返回的方法。

我的存儲過程:

SELECT    states.name as stateName,   fam.*
FROM            Family fam
WHERE        fam.idUserName=@username 

SELECT      person.*
FROM            person
INNER JOIN Family fam on fam.Id = person.idFamily
WHERE        fam.idUserName=@username

當第二條SQL語句具有記錄時,設置ReturnObject.familymembers不會出現任何問題,但是我在弄清楚如何指定默認值或處理Dapper的空返回值時遇到了麻煩。 調試時,如果未返回任何行,則ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable()會引發null異常。

這是我認為可行的方法,但無效:

ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable().DefaultIfEmpty<InternalObjects.Person>();

        public InternalObjects.FamilyDashboard GetDashboardInfo(string username)
    {
        InternalObjects.FamilyDashboard ReturnObject = new InternalObjects.FamilyDashboard();

        using (var dbConnection = _dbConnectionFactory.CreateConnection())
        {
            using (var multi = dbConnection.QueryMultiple("DashboardSP", new { username = username }, commandType: CommandType.StoredProcedure))
            {
                ReturnObject  = multi.Read<InternalObjects.FamilyDashboard>().SingleOrDefault();
                ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable();

            }
        }
        return ReturnObject;
    }

我的DTO:

public class InternalObjects
{
    public class FamilyDashboard
    {
        public string physicalAddress1 { get; set; }
        public string MailingAddress1 { get; set; }
        public string physicalAddressCity { get; set; }
        public string physicalAddressZip { get; set; }
        public string MailingAddressCity { get; set; }
        public string NumInHousehold { get; set; }
        public string capidCounty { get; set; }
        public string physicalUnit { get; set; }
        public string mailingUnit { get; set; }
        public string familyPhone { get; set; }
        public string capCharacteristics { get; set; }
        public IEnumerable<Person> familymembers {get; set;}

    }
    public class Person
    {
        public int Id { get; set; }
        public string firstName { get; set; }
        public string lastName { get; set; }
        public string middleName { get; set; }
        public int gender { get; set; }
        public DateTime birthdate { get; set; }
        public string emailPersonal { get; set; }
        public string SSN { get; set; }
        public string relationshipName { get; set; }
        public string primaryLanguageName { get; set; }

        public int age { get; set; }

    }
}

我找到了答案:

基本上,如果沒有行返回,dapper不會返回任何值,這不會實例化我的對象。 我的父對象ReturnObject尚未實例化,但仍可以正常執行。

下一行ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable()嘗試訪問該對象,但DTO不存在。

一個簡單的條件可以節省一天:

if (ReturnObject != null)
{
    ReturnObject.familymembers = multi.Read<InternalObjects.Person>().ToList<InternalObjects.Person>();
}

任何遇到相同問題的人的參考!:

如何從Dapper查詢而不是default(T)返回null?

使Dapper返回空字符串而不是空字符串

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM