এই সমাধানটি @ পিয়াস থেকে সমাধানের উপর প্রচুর ঝোঁক। এসকিউএল ইনজেকশন প্রশমিত করতে আমি ক্যোয়ারী প্যারামিটারগুলি সমর্থন করার বিকল্পটি যুক্ত করতে চেয়েছিলাম এবং এটিকে আরও কিছুটা সংহত করার জন্য আমি এটিটি ফ্রেমওয়ার্ক কোরের জন্য DbContext ডেটাবেসফ্যাকডকে এটিকে একটি এক্সটেনশানও বন্ধ করে দিতে চেয়েছিলাম।
প্রথমে এক্সটেনশন সহ একটি নতুন শ্রেণি তৈরি করুন:
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Threading.Tasks;
namespace EF.Extend
{
public static class ExecuteSqlExt
{
public static List<T> ExecuteSqlRawExt<T, P>(this DatabaseFacade db, string query, Func<DbDataReader, T> map, IEnumerable<P> queryParameters = null)
{
using (var command = db.GetDbConnection().CreateCommand())
{
if((queryParameters?.Any() ?? false))
command.Parameters.AddRange(queryParameters.ToArray());
command.CommandText = query;
command.CommandType = CommandType.Text;
db.OpenConnection();
using (var result = command.ExecuteReader())
{
var entities = new List<T>();
while (result.Read())
{
entities.Add(map(result));
}
return entities;
}
}
}
}
}
উপরের দিকে নোট করুন যে "টি" হ'ল রিটার্নের ধরণ এবং "পি" আপনার ক্যোয়ারী প্যারামিটারগুলির প্রকার যা আপনি মাইএসকিএল, এসকিএল, ইত্যাদি ব্যবহার করছেন যদি তার ভিত্তিতে পরিবর্তিত হয়।
পরবর্তী আমরা একটি উদাহরণ দেখাব। আমি মাইএসকিএল ইএফ কোর সক্ষমতাটি ব্যবহার করছি, তাই আমরা আরও নির্দিষ্ট মাইএসকিএল বাস্তবায়নের সাথে কীভাবে উপরের জেনেরিক এক্সটেনশনটি ব্যবহার করতে পারি তা আমরা দেখতে পাব:
using EF.Extend;
namespace Car.Api.Controllers
{
public class Car
{
public string Make { get; set; }
public string Model { get; set; }
public string DisplayTitle { get; set; }
}
[ApiController]
public class CarController : ControllerBase
{
private readonly ILogger<CarController> _logger;
private readonly CarContext _context;
public CarController(ILogger<CarController> logger, CarContext context)
{
_logger = logger;
_context = context;
}
[HttpGet]
public IEnumerable<Car> Get()
{
MySqlParameter p1 = new MySqlParameter
{
ParameterName = "id1",
Value = "25"
};
MySqlParameter p2 = new MySqlParameter
{
ParameterName = "id2",
Value = "26"
};
MySqlParameter p3 = new MySqlParameter
{
ParameterName = "id3",
Value = "27"
};
List<MySqlParameter> queryParameters = new List<MySqlParameter>() { p1, p2, p3 };
List<Car> result = _context.Database.ExecuteSqlRawExt<Car, MySqlParameter>(
"SELECT Car.Make, Car.Model, CONCAT_WS('', Car.Make, ' ', Car.Model) As DisplayTitle FROM Car WHERE Car.Id IN(@id1, @id2, @id3)",
x => new Car { Make = (string)x[0], Model = (string)x[1], DisplayTitle = (string)x[2] },
queryParameters);
return result;
}
}
}
ক্যোয়ারিতে সারিগুলি ফিরে আসবে যেমন:
"ফোর্ড", "এক্সপ্লোরার", "ফোর্ড এক্সপ্লোরার"
"টেসলা", "মডেল এক্স", "টেসলা মডেল এক্স"
প্রদর্শনের শিরোনামটি একটি ডাটাবেস কলাম হিসাবে সংজ্ঞায়িত করা হয়নি, সুতরাং এটি ডিফল্টরূপে EF কার মডেলের অংশ হবে না। আমি সম্ভাব্য সমাধানগুলির মধ্যে একটি হিসাবে এই পদ্ধতির পছন্দ করি। এই পৃষ্ঠার অন্যান্য উত্তরগুলি [নটম্যাপড] ডিকোরিটারের সাথে এই সমস্যাটির সমাধান করার অন্যান্য উপায়গুলি উল্লেখ করে, যা আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে আরও উপযুক্ত পদ্ধতির হতে পারে।
নোট করুন যে এই উদাহরণের কোডটি স্পষ্টতই এটির প্রয়োজনের চেয়ে বেশি ভার্বোজ, তবে আমি ভেবেছিলাম এটি উদাহরণটি আরও পরিষ্কার করে দিয়েছে।