เหตุใด NpgsqlParameter จึงไม่ทำงานเมื่อส่งผ่านไปยัง DbSet.FromSqlRaw

Sep 03 2020

ในฐานะที่ฉันกล่าวถึงในชื่อเรื่องไม่ได้ทำงานเมื่อฉันผ่านDbSet.FromSqlRaw NpgsqlParameterฉันมักจะได้ค่าว่าง

นี่คือรูปแบบบางส่วนที่ฉันได้ลอง:

long value = 3;
NpgsqlParameter npgsqlParameter = new NpgsqlParameter("value", value);
string query = "SELECT * FROM \"Admin\".\"User\" as usr WHERE \"usr\".\"Value\" = '@value'";

var _user = _AdminPanelDbContext
           .User
           .FromSqlRaw(query, npgsqlParameter)
           .FirstOrDefault();
long value = 3;
NpgsqlParameter npgsqlParameter = new NpgsqlParameter("value", value);
string query = "SELECT * FROM \"Admin\".\"User\" as usr WHERE \"usr\".\"Value\" = ':value'";

var _user = _AdminPanelDbContext
           .User
           .FromSqlRaw(query, npgsqlParameter)
           .FirstOrDefault();

ก่อนที่จะมีคนถามว่า "ทำไมคุณไม่ใช้อินไลน์อินเตอร์โพลสตริง" แบบนี้.

FromSqlRaw($"SELECT * FROM \"Admin\".\"User\" as usr WHERE \"usr\".\"Value\" = {value}");

เหตุผลประการแรกคือเนื่องจากฉันใช้คิวรี sql นั้นซ้ำ (เพื่อให้แม่นยำยิ่งขึ้นบันทึกเพื่อตรวจสอบ) และเหตุผลที่สองคือฉันทราบว่าNpgsqlParameterการแทรก SQL นั้นปลอดภัยเช่นกัน

คำตอบ

2 fuzzy_logic Sep 04 2020 at 13:31

ขอโทษค่ะตอนนี้ตรวจสอบไวยากรณ์ที่แน่นอนไม่ได้ แต่จะเป็นอย่างไร:

    long value = 3;
    var searchParam = new NpgsqlParameter("value", value);
    var _user = _AdminPanelDbContext.User.FromSqlRaw("select * from admin.user as usr where usr.value = @searchParam;", searchParam).FirstOrDefault();

มีตัวอย่างแบบ end-to-end เป็นที่นี่

อย่างไรก็ตามดูเหมือนว่าคุณกำลังใช้ Postgres ถ้าใช่ให้อธิบายว่าเหตุใดคุณจึงเห็นข้อผิดพลาดเกี่ยวกับการต้องใช้ NpgsqlParameter แทน SqlParameter