Как изменить LINQ O/R-M имя таблицы / источник во время времени выполнения?

Чтобы сделать ваш код более похожим на игру RushHour, мы можем инкапсулировать некоторые правила игры в объект Vehicle. Транспортное средство может отслеживать, где оно находится в сетке и его собственное выбранное состояние. Это позволяет нам иметь меньше массивов и в целом упрощает представление об игре.

Этот код не является полноценной игрой RushHour, но он приближает вас к решению.

var rows = 6
var columns = 6
var vehicles = [];
var selectedVehicle;
var vehicleIds = 0; 
var vehicleSize;

var Vehicle = function( row,  col,  direction){
  this.row = row;
  this.col = col;
  this.vehicleId = vehicleIds++;
  this.selectedState = false;
  this.direction = direction;
  this.xPos = col * vehicleSize;
  this.yPos = row * vehicleSize;
};

function setup() {
  createCanvas(500, 500);
  vehicleSize = width/columns;
   vehicles.push(new Vehicle(3,3, "horz"));
   vehicles.push(new Vehicle(4,3, "vert"));
}

function draw() {
  background(0);
  for (var x = 0; x < width; x += width / columns) {
     for (var y = 0; y < height; y += height / rows) {
        stroke(255);
        strokeWeight(1);
        line(x, 0, x, height);
        line(0, y, width, y);
     }
     
    for (i=0; i < vehicles.length; i++){
      let vehicle = vehicles[i];
      if(vehicle.selectedState){
        fill(255,0,0)
      }else{
        fill(255)
      }
      rect(vehicle.col * vehicleSize, vehicle.row * vehicleSize, vehicleSize, vehicleSize) 
    }
  }
}

function mousePressed(){
  for (i=0; i < vehicles.length; i++){
    let vehicle = vehicles[i];
    x = vehicle.xPos;
    y = vehicle.yPos;
    w = vehicleSize;
    h = vehicleSize;
    vehicle.selectedState = false;
    if (mouseX > x && mouseX < x + w && mouseY > y && mouseY < y + h){
      selectedVehicle = vehicle;
      selectedVehicle.selectedState = true;
    }
  }
}
function keyPressed() {
  if (keyCode === LEFT_ARROW) {
    if (canMoveLeft(selectedVehicle)){
      selectedVehicle.col--;
      selectedVehicle.xPos -= vehicleSize;
    }
  }
  if (keyCode === RIGHT_ARROW) {
    if (canMoveRight(selectedVehicle)){
      selectedVehicle.col++;
      selectedVehicle.xPos += vehicleSize;
    }
  }
  if (keyCode === UP_ARROW) {
    if (canMoveUp(selectedVehicle)){
      selectedVehicle.row--;
      selectedVehicle.yPos -= vehicleSize;
    }
  }
  if (keyCode === DOWN_ARROW) {
    if (canMoveDown(selectedVehicle)){
      selectedVehicle.row++;
      selectedVehicle.yPos += vehicleSize;
    }
  }
}

function canMoveLeft(vehicle){
  if (vehicle.col > 0 && vehicle.direction === "horz"){
    for (let i = 0; i < vehicles.length; i++){
      let otherVehicle = vehicles[i];
      if (otherVehicle.row === vehicle.row && otherVehicle.col === vehicle.col - 1){
        return false;
      }
    }
  } else {
    return false;
  }
  return true;
}

function canMoveRight(vehicle){
  if (vehicle.col < columns - 1 && vehicle.direction === "horz"){
    for (let i = 0; i < vehicles.length; i++){
      let otherVehicle = vehicles[i];
      if (otherVehicle.row === vehicle.row && otherVehicle.col === vehicle.col + 1){
        return false;
      }
    }
  } else {
    return false;
  }
  return true;
}

function canMoveDown(vehicle){
  if (vehicle.row < rows - 1 && vehicle.direction === "vert"){
    for (let i = 0; i < vehicles.length; i++){
      let otherVehicle = vehicles[i];
      if (otherVehicle.col === vehicle.col && otherVehicle.row === vehicle.row + 1){
        return false;
      }
    }
  } else {
    return false;
  }
  return true;
}

function canMoveUp(vehicle){
  if (vehicle.row > 0 && vehicle.direction === "vert"){
    for (let i = 0; i < vehicles.length; i++){
      let otherVehicle = vehicles[i];
      if (otherVehicle.col === vehicle.col && otherVehicle.row === vehicle.row - 1){
        return false;
      }
    }
  } else {
    return false;
  }
  return true;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.3/p5.min.js"></script>

Для завершения игры вам необходимо расширить код на:

  • Ручка транспортные средства, длина которых превышает один квадрат
  • Дайте пользователю указание того, каким образом движется транспортное средство (влево / вправо или вверх / вниз)
  • Укажите выходной квадрат, чтобы основной автомобиль мог выехать сетки
6
задан Sam 4 March 2009 в 10:14
поделиться

2 ответа

Отчасти... Необходимо было бы сделать что-то вроде этого:

  1. Создайте объекты в разработчике.
  2. Используйте SqlMetal для генерации xml, который отображающийся файл из .dbml файла генерирует разработчиком.
  3. Обновите имена таблиц в XML-файле.
  4. Затем в Вашем коде, используйте перегрузку конструктора DataContext, которая принимает XmlMappingSource, созданный с xml отображающийся файл.

Вот сообщение в блоге, которое объясняет этот этап процесса шагом: http://weblogs.asp.net/guybarrette/archive/2008/07/23/linq-to-sql-dynamic-mapping.aspx

Я использую подобный процесс с базой данных ERP, которая имеет имена таблиц как ttccom001xxx, где xxx является идентификатором установки (я знаю, что это - ужасная схема, но нет ничего, что я могу делать с этим). У нас есть несколько установок, таким образом, я копирую начальную букву xml отображающийся однажды для каждой установки и затем заменяю xxx идентификатором установки. Я записал маленькое консольное приложение, которое использует Regex для заботы замен и добавило его как часть моего процесса сборки.

7
ответ дан 10 December 2019 в 00:45
поделиться

Вот ссылка на Внешнюю Ссылку Отображения Microsoft.

Внешнее отображение переопределяет основанное на атрибуте отображение.

Вот основы.

  1. Создайте некоторый xml, который представляет Ваши отображения.
  2. Новый XmlMappingSource и дают ему Ваш xml.
  3. При построении DataContext используйте Конструктора, который принимает XmlMappingSource, такой как этот.
3
ответ дан 10 December 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: