2016-02-25 6 views
1

* Можете ли вы объяснить Разделить на функцию в Multimap *Много картирование в Dapper. Получив сообщение об ошибке в SpiltOn

Я пытаюсь получить данные из базы данных, используя Dapper ОРМ. Я получил следующую ошибку System.ArgumentException: При использовании API-интерфейсов многоканальных отображений убедитесь, что вы установите splitOn параметры, если у вас есть другой, чем Id имя параметров ключ: splitOn

public abstract class Domain 
    { 
     public Guid Id { get; set; } 
    } 


public abstract class ItemBase : Domain 
    { 
    private IList<Image> images = new List<Image>(); 
    public Guid? ParentId { get; set; } 
    public string Name { get; set; } 
    public IList<Image> Images { get { return images; } } 
    } 

public class Meal : ItemBase 
    { 

    } 

public class Item : ItemBase 
    { 
    private IList<Meal> meals = new List<Meal>(); 
    public IList<Meal> Meals { get { return meals; } }; 
    } 


public class Image : Domain 
    { 
     public byte Img { get; set; } 
     public string Description { get; set; } 
    } 



public class MealImageLink : Domain 
{ 
    public Guid ItemId { get; set; } 
    public Guid ImageId { get; set; } 
} 

/* поиск функция взять Даты из таблицы */

private List<Meal> SearchMeals(Guid id) 
{ 
    var query = @"SELECT meal.[Name],meal.[Description],meal. 

    [Price],mealImage.[Image] as Img  
            FROM  [MealItems] as meal 
            LEFT JOIN [MealImageLink] mealImageLink 

    on meal.Id= mealImageLink.MealItemId 
            LEFT JOIN [Images] mealImage on 

    mealImageLink.ImageId=mealImage.Id 
            WHERE meal.[ParentId][email protected]"; 

List<Meal> meals = (_connection.Query<Meal, MealImageLink, Image, Meal> 
             (query, (meal, mealLink, mealImage) => 
             { 
              meal.Images.Add(mealImage); 
              return meal; 
             }, new { @Id = id })).ToList(); 
return meals; 
} 

ответ

1

функция мульти-карты действительно больше предназначена для сценариев, таких как:

select foo.Id, foo.whatever, ..., 
     bar.Id, bar.something, ..., 
     blap.Id, blap.yada, ... 
from foo ... 
inner join bar ... 
left outer join blap ... 

или ленивее, но не редкость:

select foo.*, bar.*, blap.* 
from ... 
inner join bar ... 
left outer join blap ... 

Но в обоих этих случаях, есть явный и очевидный способ разделить горизонтальный диапазон на разделы; в основном, когда вы видите столбец с именем Id, это следующий блок. Имя Id настраивается для удобства и может быть списком столбцов с разделителями для сценариев, где каждая таблица имеет другое имя первичного ключа (поэтому User может иметь UserId и т. Д.).

Ваш сценарий кажется совершенно иным. Похоже, вы в настоящее время выбираете только 4 столбца без особого способа их разделения. Я предположил бы, что в этом случае, то проще заполнить вашу модель через другую API - в частности, dynamic API:

var meals = new List<Meal>(); 
foreach(var row in _connection.Query(sql, new { @Id = id })) 
{ 
    string name = row.Name, description = row.Description; 
    decimal price = row.Price; 
    // etc 

    Meal meal = // TODO: build a new Meal object from those pieces 
    meals.Add(meal); 
} 

dynamic API доступен, просто не указывая какой-либо <...>. Сделав это, столбцы доступны по имени, с их типами подразумеваемых тем, что они назначаются на - следовательно, такие вещи, как:

decimal price = row.Price; 

Примечание: если вы хотите, чтобы потреблять row данных «инлайн», а затем просто бросить как можно скорее, т.е.

// bad: forces everything to use dynamic for too long 
new Meal(row.Name, row.Description, row.Price); 

// good: types are nailed down immediately 
new Meal((string)row.Name, (string)row.Description, (decimal)row.Price); 

ли это помощь?

Tl; dr: Я просто не думаю, что мульти-сопоставление имеет отношение к вашему запросу.


Edit: вот моя догадка на то, что вы собираетесь делать - это просто не хорошо подходит для мульти-карты:

var meals = new List<Meal>(); 
foreach (var row in _connection.Query(query, new { @Id = id })) { 
    meals.Add(new Meal { 
     Name = (string)row.Name, 
     Images = { 
      new Image { 
       Description = (string)row.Description, 
       Img = (byte)row.Img 
      } 
     } 
    }); 
} 
return meals; 
+0

Можете ли вы объяснить подробно о динамических API ниже код * ** 'var meal = new Список (); foreach (var row in _connection.Query (sql, new {@Id = id})) { string name = row.Name, description = row.Description; десятичная цена = ряд.Цена; // etc Еда еды = // TODO: построить новый объект еды от этих кусков еды.Add (еда); } '*** – chaaru

+0

В соответствии с пониманием функции расщепления у меня был код как ***' Список food = (_connection.Query (запрос, (еда, едаLink, едаImage) => { meal.Images.Add (foodImage); return meal; }, новый {@Id = id}, splitOn: "Name")). ToList(); '** *, Я получаю ту же ошибку – chaaru

+0

«Я переделал код как ...» - действительно; вы говорите ему, чтобы разделить горизонтальные разделы на столбец под названием «Имя». Единственный столбец с именем 'Name' происходит * в первом столбце *. Не было бы никакого способа получить какие-либо данные для каких-либо других разделов ... так ... сообщение правильно идентифицирует, что что-то очень не так. –

 Смежные вопросы

  • Нет связанных вопросов^_^